home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / Mm2_txt / ANHANGF.TXT next >
Encoding:
Text File  |  1997-02-07  |  90.3 KB  |  1,935 lines

  1. A.1  Fehlermeldungen des Compilers                                      Anhang
  2. ________________________________________________________
  3.  
  4.  
  5. Anhang
  6.  
  7. Der Anhang ist vor allem zum Nachschlagen während der Arbeit mit Megamax
  8. Modula gedacht. Oft finden Sie Erläuterungen zu den hier abgedruckten Daten
  9. in den entsprechenden vorhergehenden Kapiteln des Handbuchs.
  10.  
  11.  
  12. A.1   Fehlermeldungen  des  Compilers
  13.  
  14. Die  folgenden  Fehlermeldungen  werden  nach  einem  Fehler  auch  im  Editor
  15. angezeigt. Hier finden Sie aber zusätzliche Erläuterungen oder Tips zu einigen
  16. Meldungen, die sonst vielleicht etwas knapp die Fehlerursache beschreiben.
  17.  
  18.  
  19. Fehler im Modulkopf und im Textformat
  20.  
  21.     100 :  Moduldeklaration erwartet
  22.                 Programm beginnt nicht mit   DEFINITION | IMPLEMENTATION  
  23.                 MODULE.
  24.     101 :  Bezeichner erwartet
  25.                 Statt   eines   Bezeichners   steht   ein   Schlüsselwort   oder
  26.                 Satzzeichen.
  27.     102 :  Modulname erwartet
  28.                 Statt   eines   Modulnamens   steht   ein   Schlüsselwort   oder
  29.                 Satzzeichen.
  30.     103 :  IMPORT erwartet
  31.                 Nach FROM <Modulname> wird IMPORT erwartet.
  32.     104 :  Qualifizierter Name hier nicht erlaubt
  33.                 Bezeichner dürfen hier keine führenden Qualifier haben.
  34.     105 :  Falscher Bezeichner am Blockende
  35.                 Modul-/Prozedurname nach END stimmt nicht  mit  dem  Kopf
  36.                 überein. Evtl. fehlt ein END zu einer Kontrollstruktur.
  37.     106 :  Fehlerhafte Kommentar-Schachtelung
  38.                 Mehr Kommentarklammern geschlossen als geöffnet.
  39.     107 :  Fehler in Compiler-Direktive
  40.                 Syntaxfehler in einer Compiler-Direktive. Siehe Kapitel 3.4.
  41.     108 :  Unerwartetes Ende des Quelltextes (evtl. fehlendes '*)')
  42.                 Ende des Quelltextes mitten im Modul; auch bei nicht korrekt
  43.                 abgeschlossenen Kommentaren.
  44.  
  45.  
  46. Fehler im Deklarationsteil
  47.  
  48.     200:  Fehler im Deklarationsteil
  49.                 TYPE, CONST, VAR, PROCEDURE oder MODULE erwartet.
  50.     201 :  Bezeichner doppelt deklariert
  51.                 Bezeichner  ist  auf  dieser  Ebene  schon  deklariert  (evtl.
  52.                 importiert,  evtl.  auch  durch  einen  Aufzählungstyp   schon
  53.                 verdeckt vorhanden/importiert).
  54.     202:  Bezeichner ... doppelt deklariert
  55.                 s. Fehler 202
  56.     203:  Bezeichner erwartet, Schlüsselwort gefunden
  57.                 Der deklarierte Bezeichner ist als Schlüsselwort reserviert.
  58. A.1  Fehlermeldungen des Compilers                                      Anhang
  59. ________________________________________________________
  60.  
  61.  
  62.     204:  Fehler in Typdeklaration
  63.                 Syntaktischer Fehler in der Typdeklaration.
  64.     205:  Undeklarierter Bezeichner
  65.                 Der  Bezeichner  ist  noch  nicht  vorher  im  Text  deklariert
  66.                 worden.
  67.     206:  Falsches Symbol (vielleicht vorher fehlendes ';' oder '!')
  68.                 Gefundenes Modul-Wort hier unzulässig.
  69.     207:  ';' erwartet (vielleicht auf voriger Zeile)
  70.     208:  ':' erwartet
  71.     209:  '=' erwartet
  72.     210 :  '..' erwartet
  73.     211 :  ' ' erwartet
  74.     212 :  >schließende eckige Klammer< erwartet
  75.                 ' ' erwartet.
  76.     213 :  OF erwartet
  77.     214 :  END erwartet
  78.     215 :  Array-Index muß Unterbereich oder Aufzählung sein
  79.     216 :  SET-Basistyp muß Unterbereich oder Aufzählung sein
  80.     217 :  Opaque-Typen müssen LONGWORD-kompatibel sein
  81.                 Opaque-Typen müssen als 32 Bit-Typ implementiert werden.
  82.     218 :  Untergrenze größer als Obergrenze
  83.     219 :  Unter- oder Obergrenze liegt außerhalb des gültigen Bereichs
  84.     220:  Cardinal-Konstante erwartet
  85.                 ZZ,   CARDINAL,   SHORTCARD   oder   LONGCARD-Konstante
  86.                 erwartet.
  87.     221 :  Falsche Größenangabe bei TABLE-Deklaration (B, W, L, oder D)
  88.                 Nach TABLE muß ein Punkt und dann B, W, L oder D stehen.
  89.     222:  FORWARD-Deklaration ... nicht implementiert
  90.                 Die FORWARD-deklarierte Prozedur wurde nicht implementiert.
  91.     223:  String-Konstante erwartet
  92.                 Ein String-Literal wurde erwartet.
  93.     224:  ' ' erwartet
  94.     225:  POINTER-Deklaration: Ungelöste Vorwärts-Referenz von ...
  95.                 Der Typ der "POINTER TO <Typ>"-Deklaration muß im selben
  96.                 Block (Modul, Prozedur) deklariert werden.
  97.     226:  Prozedurtyp-Deklaration: Ungelöste Vorwärtsreferenz von ...
  98.                 Parameter- und Rückgabetypen von Prozedurtypen müssen im
  99.                 selben Block (Modul, Prozedur) deklariert werden.
  100.     227:  Verschiedene Real-Formate spezifiziert
  101.                 Pro Modul darf nur ein Real-Format ($F+ oder $F-) definiert
  102.                 werden.
  103.     228:  F-Direktive muß vor der Benutzung von Reals stehen
  104.                 Sobald Reals (Ausdrücke oder Konstanten) benutzt wurden, ist
  105.                 keine Formatbestimmung mehr möglich.
  106.     229:  Register-Variable bei diesem Typ nicht verwendbar
  107.                 Variablen dieses Typs können nicht im Register gehalten werden.
  108.     230:  Typ-Bezeichner erwartet
  109.                 MIN,  MAX,  TSIZE,  CAST  und  VAL  erwarten  zuerst  einen
  110.                 Typ-Namen; In TYPE-Deklarationen wird zuerst ein Typ-Name
  111.                 erwartet.
  112.     231 :  Typ-Bezeichner noch nicht deklariert
  113.                 Der Typ wurde bisher nur in POINTER TO oder Prozedurtyp~
  114.                 Deklarationen verwendet und  ist  selbst  noch  nicht  deklariert
  115.                 worden.
  116.     232:  Typ-Bezeichner ... nicht deklariert
  117.                 s. Fehler 231
  118. A.1  Fehlermeldungen des Compilers                                      Anhang
  119. ________________________________________________________
  120.  
  121.  
  122.  
  123. Fehler in Konstanten (Literalen)
  124.  
  125.     300:  Konstante erwartet
  126.     301 :  Unzulässiger Konstanten-Typ
  127.     302:  Zahl zu groß
  128.     303:  Falsches Zahlenformat
  129.     304:  Überlauf in Mantisse
  130.                 Fehlerhafte Real-Konstante.
  131.     305:  Überlauf im Exponenten
  132.                 Fehlerhafte Real-Konstante.
  133.  
  134.  
  135. Fehler in Anweisungen
  136.  
  137.     400:  Fehlerhaftes Statement (Anweisung)
  138.     401 :  DO erwartet
  139.     402:  UNTIL erwartet
  140.     403:  THEN erwartet
  141.     404:  TO erwartet
  142.     405:  ':=' erwartet
  143.     406:  '.' erwartet
  144.     407:  Boolescher Ausdruck erwartet
  145.     408:  EXIT ohne LOOP
  146.     409:  Fehlendes RETURN in dieser Funktion
  147.     410 :  Record-Bezeichner erwartet
  148.     411 :  CASE-Marke doppelt deklariert
  149.     412 :  CASE-Selektor muß skalar sein
  150.     413 :  '!' oder END erwartet
  151.     414 :  Variable erwartet
  152.     415 :  Prozedur liefert ein Ergebnis
  153.                 Das  Ergebnis  dieser  Funktionsprozedur  muß   ausgewertet
  154.                 werden.
  155.     420:  Schleifenzähler muß ordinal sein
  156.                 Die FOR-Variable muß ordinal sein.
  157.     421 :  Inkrement muß Ganze-Zahl-Konstante sein
  158.                 Der  BY-Wert  der  FOR-Schleife  muß  eine  CARDINAL-  oder
  159.                 INTEGER-Konstante sein.
  160.     422:  Schleifenvariable muß einfache, lokale, Variable sein
  161.                 Die FOR-Variable muß im selben Level deklariert worden sein.
  162.                 Sie darf weder ex- noch importiert und auch kein Record- oder
  163.                 Array-Element sein.
  164.     423:  Auf Schleifenvariable wurde in lokaler Prozedur zugegriffen
  165.                 FOR-Variablen dürfen nicht außerhalb der FOR-Schleife benutzt
  166.                 werden.
  167.     424:  Schleifenvariable und obere Grenze müssen identischen Typ haben
  168.                 Der Typ der FOR-Variable muß identisch mit dem der Ober~
  169.                 grenze sein.
  170.  
  171.     430:  Ganzzahl-Konstante erwartet
  172.                 Der BY-Wert des ARRAY-Aggregats muß eine CARDINAL- oder
  173.                 INTEGER-Konstante sein.
  174.     431 :  BY-Wert liegt außerhalb des gültigen Bereichs
  175.                 Der BY-Wert des ARRAY-Aggregats muß größer als Null aber
  176.                 nicht größer als die noch verbliebene Anzahl Felder sein.
  177. A.1  Fehlermeldungen des Compilers                                      Anhang
  178. ________________________________________________________
  179.  
  180.  
  181. Fehler in Ausdrücken
  182.  
  183.     500:  Typen sind nicht zuweisungskompatibel
  184.                 Der Typ des Ausdrucks ist nicht kompatibel zur Ziel-Variable
  185.                 bzw. zum Ziel-Parameter.
  186.     502:  Fehler in Faktor (fehlerhafter Ausdruck)
  187.     503:  '-' nicht erlaubt
  188.     504:  '(' erwartet
  189.                 Die Prozedur erwartet eine Argumentliste.
  190.     505:  ')' erwartet
  191.                 Im   Ausdruck:   so   viele   Klammern   sind   nicht   geöffnet;
  192.                 Bei Prozeduraufruf: So viele Argumente erwartet die Prozedur
  193.                 nicht.
  194.     506:  ',' erwartet
  195.                 Bei Prozeduraufruf wurden zu wenig Argumente übergeben.
  196.     510 :  Zahl (CARDINAL, INTEGER, REAL) erwartet
  197.     511 :  CHAR-Typ erwartet
  198.     512 :  Ganzzahl (CARDINAL, INTEGER) erwartet
  199.     513 :  INTEGER oder REAL erwartet
  200.     514 :  REAL oder LONGREAL erwartet
  201.     515 :  REAL oder ordinaler Typ erwartet
  202.     516 :  Skalarer Typ erwartet
  203.     517 :  Dieser Bezeichner ist nicht vom ARRAY-Typ
  204.     518 :  Dieser Bezeichner ist nicht vom RECORD-Typ
  205.     519 :  Dieser Bezeichner ist nicht vom POINTER-Typ
  206.     520:  SET OF BITNUM-Typ erwartet
  207.                 SHIFT und ROTATE erlauben nur SETs vom BITNUM-Typ.
  208.     521 :  Prozedur oder Variable vom Prozedur-Typ erwartet
  209.     522:  Variable oder Konstante erwartet
  210.     523:  String-Typ erwartet
  211.     524:  Größe der Variable paßt nicht zum Register
  212.                 LOAD und STORE nur auf Typen mit maximal 32 Bit anwendbar.
  213.     525:  Skalar oder Adresse erwartet (Datumsgröße max. 4 Byte)
  214.                 CALLSYS und CALLEXT erlauben keine Strukturen als Argumente.
  215.     526:  Falsche String-Länge
  216.     527:  Falscher Indextyp
  217.                 ARRAY durch falschen Typ indiziert.
  218.     528:  Prozedur liefert kein Ergebnis
  219.                 Diese Prozedur hat keinen Rückgabewert.
  220.     529:  Nur SETs, ARRAYs und RECORDs können konstruiert werden
  221.                 Der Bezeichner vor dem " " ist kein strukturierter Typ.
  222.     530:  Lokale oder Standardprozedur nicht erlaubt (nur globale)
  223.                 Nur  globale  Prozeduren  sind  auf   Prozedur-Variable   und
  224.                 -Parameter zuweisbar.
  225.     532:  Benutzte Z-Direktiven stimmen nicht überein
  226.                 Alle   Prozedurkopf-Definitionen   (Definitionsmodul,   Forward-
  227.                 Dekl.,  Prozedurtyp-Dekl.  und  Prozedur-Implem.)  müssen  mit
  228.                 derselben Z-Direktiven-Einstellung übersetzt werden.
  229.     533:  Pointer noch nicht vollständig deklariert
  230.                 Der Pointer kann nicht dereferenziert werden, weil der Typ aus
  231.                 der POINTER TO-Deklaration noch nicht deklariert worden ist.
  232.     540:  Typkonflikt zwischen den Operanden
  233.                 Es wurden zwei Operanden verschiedenen Typs verknüpft.
  234.     541 :  Falscher Operator oder Operandentyp
  235.                 Operation auf diesem Operanden-Typ nicht definiert.
  236. A.1  Fehlermeldungen des Compilers                                      Anhang
  237. ________________________________________________________
  238.  
  239.  
  240.     542:  Nur '=' und '<>' sind auf diesen Typ anwendbar
  241.                 Gilt für Opaque-, POINTER- und Prozedur-Typen.
  242.     543:  Negation nur bei Integer-Typen erlaubt
  243.                 Das  Minus-Zeichen  kann  nur  bei  INTEGER-  und  Real-Typen
  244.                 angewandt werden.
  245.     550:  Zu wenige Parameter beim Aufruf
  246.                 Bei Prozeduraufruf wurden zu wenige Argumente übergeben.
  247.     551 :  Typ muß identisch mit VAR-Parameter sein
  248.                 Der Typ des Arguments muß mit dem Parameter identisch sein
  249.                 oder  dieselbe  Größe  haben.  Bei  Parametern  vom  Typ  LOC,
  250.                 BYTE,   WORD   oder   LONGWORD   muß   nur   die   Größe
  251.                 übereinstimmen, bei Parametern vom Typ ADDRESS muß  ein
  252.                 POINTER-Typ übergeben werden.
  253.     552:  HIGH-Funktion nur auf 'Open Array' anwendbar
  254.                 HIGH() nur auf offene formale Parameter anwendbar. Verwende
  255.                 SIZE().
  256.     553:  SIZE-Funktion nicht auf 'Open Array' anwendbar
  257.                 SIZE()  ist  nicht  auf  offene  Felder  anwendbar.  Verwende
  258.                 HIGH().
  259.     554:  'Open Array' kann nur an 'Open Array'-Parameter übergeben werden
  260.                 Ein offenes Feld kann nicht auf normale Strukturen zugewiesen
  261.                 werden.
  262.     555:  Argument hat zu wenig Array-Dimensionen
  263.                 Der Parameter erwartet mehr Dimensionen als das Argument
  264.                 enthält.
  265.     556:  Array-Größe muß ganzes Vielfaches von Joker-Größe sein
  266.                 Bei ARRAY OF WORD/LONGWORD muß Argument eine durch
  267.                 zwei bzw. vier teilbare Größe haben.
  268.     557:  LONGARRAY kann nicht an Short-Index übergeben werden
  269.                 Parameter muß LONGARRAY OF statt ARRAY OF annehmen.
  270.     558:  Parameter-Typ noch nicht deklariert
  271.                 Die  Prozedur  kann  nicht  aufgerufen  werden,  weil  einer  der
  272.                 Parameter des Prozedurtyps noch nicht deklariert wurde.
  273.     559:  Rückgabe-Typ noch nicht deklariert
  274.                 Die Prozedur kann nicht aufgerufen werden, weil der Rückgabe-
  275.                 Typ des Prozedurtyps noch nicht deklariert wurde.
  276.     560:  Parm- oder Return-Typ des Prozedurtyps noch nicht deklariert
  277.                 Der  Prozdurtyp  kann  nicht  ausgewertet  werden,  da  seine
  278.                 Parameter- und Rückgabe-Typen noch nicht deklariert wurden.
  279.     561 :  Datenumwandlung nicht mit diesen Typen möglich
  280.                 VAL erlaubt diese Datenumwandlung nicht.
  281.     562:  Typ-Konvertierung nur zwischen Typen gleicher Länge
  282.                 Die Form "<Typname> (<Ausdruck>)" verlangt gleiche Größen.
  283.     563:  CAST nur bei gleichen Größen oder Skalaren möglich
  284.                 CAST  kann  bei  diesen  Typ  die  Größenumwandlung  nicht
  285.                 eindeutig vornehmen.
  286.     570:  Verwendung von geschützter Variable hier nicht erlaubt
  287.                 REF-Parameter und FOR-Variable: ADR() nicht erlaubt.
  288.     571 :  Zuweisung auf geschützte Variable nicht erlaubt
  289.                 Die  Zuweisung,  die  Übergabe  an  VAR-Parameter  und  die
  290.                 Verwendung als FOR-Variable ist bei REF-Parametern und bei
  291.                 bereits benutzten FOR-Variablen nicht erlaubt.
  292.     572:  Hier darf keine Register-Variable verwendet werden
  293.                 Verwendung bei  ADR()  und  WITH  sowie  Übergabe  an  VAR-
  294.                 Parameter hier nicht erlaubt.
  295.     573:  Zugriff auf Register-Variable in lokaler Prozedur nicht möglich
  296.                 Register-Variable können nur im Code der selben Ebene benutzt
  297.                 werden.
  298.     574:  Auf die Variable ist noch kein Wert zugewiesen worden
  299.                 Inhalt der Variable ist an dieser Stelle noch undefiniert.
  300. A.1  Fehlermeldungen des Compilers                                      Anhang
  301. ________________________________________________________
  302.  
  303.  
  304. Rechenfehler in Konstant-Ausdrücken
  305.  
  306.     580:  Konstante zu klein/groß für Zuweisung bzw. Typwandlung
  307.     581 :  Division durch Null in konstantem Ausdruck
  308.     582:  String zu groß für Zuweisung bzw. Typwandlung
  309.     583:  Bereichsüberschreitung des REAL-Wertes
  310.     584:  Fehler in konstantem Ausdruck: ...
  311.     585:  Konstante liegt außerhalb des Operandenbereichs
  312.     586:  Arithmetischer Überlauf
  313.     587:  Index liegt außerhalb des Feldbereichs
  314.     588:  Index/Subrange-Bereiche überschneiden sich nicht
  315.  
  316.  
  317. Semantische Fehler bei IMPORT und EXPORT
  318.  
  319.     700:  Exportierter Bezeichner ... nicht deklariert
  320.     701 :  Interner Fehler beim Exportieren von ...
  321.                 Die übersetzte Definitions-Datei ist fehlerhaft.
  322.     702:  Importierter Bezeichner nicht re-exportierbar
  323.     703:  Exportierte Prozedur ... nicht implementiert
  324.     704:  Prozedur-Implementation weicht von der Definition ab
  325.                 Die Prozedurköpfe sind verschieden. Beachte auch die Überein~
  326.                 stimmung der Direktiven $H und $Z!
  327.     705:  PERVASIVE Import in Definitionsmodulen nicht erlaubt
  328.                 Ein Modul, das PERVASIVE exportiert, kann nur in Implemen~
  329.                 tationsmodule importiert werden.
  330.     706:  Fehler beim Importieren
  331.                 Compiler-interner Fehler.
  332.     707:  Definitionsmodul nicht verfügbar
  333.                 Das  übersetzte  Definitionsmodul  ist  nicht  zu  finden.  Siehe
  334.                 Kapitel 2.4.
  335.     708:  Definitionsmodul zu dieser Implementation fehlt
  336.     709:  Definitionsmodul 'Runtime' fehlt
  337.     710 :  Importierter Bezeichner nicht im Definitionsmodul
  338.     711 :  System-Prozedur/-Variable ... aus Runtime-Modul fehlt
  339.                 Wahrscheinlich  wurde  eine  veraltete  Version  des  Runtime-
  340.                 Moduls vom Compiler verwendet.
  341.     712 :  Definitionsmodul hat falsches Format
  342.                 Die Datei des übersetzten Definitionsmoduls ist defekt.
  343.     713 :  Altes Modulformat (Definitionsmodul neu übersetzen!)
  344.                 Importiertes  Definitionsmodul  wurde  mit  veralteter  Compiler-
  345.                 Version übersetzt.
  346.     714 :  Bezeichner ... doppelt exportiert
  347.                 Evtl. wird ein Aufzählungstyp und dazu seine Elemente nochmals
  348.                 exportiert.
  349.  
  350. Überschreiten von Größenbeschränkungen sowie Restriktionen
  351.  
  352.     800:  String überschreitet Zeilenende
  353.     801 :  Array zu groß (max. 2^31 Byte)
  354.                 Welcher Computer hat denn so viel Speicher?!
  355.     802:  SETs können max. 2^16 Elemente haben
  356.     803:  Kein Platz für EXPORT
  357.                 Speicherplatz reicht nicht (Platz schaffen, z.B. geladene Module
  358.                 freigeben).
  359. A.1  Fehlermeldungen des Compilers                                      Anhang
  360. ________________________________________________________
  361.  
  362.  
  363.  
  364.     804:  Kein Platz für IMPORT (zu viele Importe)
  365.                 Speicherplatz reicht nicht (Platz schaffen, z.B. geladene Module
  366.                 freigeben).
  367.     805:  Definitionsmodul zu groß (Überlauf der Link-Tabelle)
  368.                 Speicherplatz reicht nicht (Platz schaffen, z.B. geladene Module
  369.                 freigeben).
  370.     806:  Überlauf des Integer-Stacks
  371.                 Schachtelungstiefe oder CASE-Labelliste zu groß.
  372.     807:  Überlauf des Bezeichner-Stacks
  373.                 Schachtelungstiefe zu groß.
  374.     808:  Zu viele Datei-Inklusionen
  375.                 Maximal 15 geschachtelte Include-Anweisungen.
  376.     809:  Kontrollstruktur zu lang
  377.                 Max. Codelänge für Schleifen und Verzweigungen ist 32 KB.
  378.     810 :  Sprung zu weit (Prozedur zu groß)
  379.                 Zu viele / zu große lokale Prozeduren.
  380.     811 :  Kein Platz mehr für Code
  381.                 Speicherplatz reicht nicht (Platz schaffen, z.B. geladene Module
  382.                 freigeben).
  383.     812 :  Datenstruktur zu groß für 'Open Array'-Parameter
  384.                 'ARRAY OF ...'-Parameter müssen durch SHORTCARD indizier~
  385.                 bar sein. Ggf. den Parameter in 'LONGARRAY OF ...' ändern.
  386.     813 :  Ausdruck zu aufwendig
  387.                 Vereinfache  den  Ausdruck  durch  Aufteilung  mit  Zwischen~
  388.                 ergebnissen.
  389.     814 :  Konstante zu groß (max. 32 KB)
  390.     815 :  String-Konstante zu groß (max. 256 Zeichen)
  391.     816 :  LONGINT kann hier nicht verwendet werden
  392.                 RECORD-Deklaration: LONGINT z.Zt. nicht für CASE-Selektor
  393.                 geeignet.
  394.     817 :  TABLE-Deklaration nur auf globalem Level erlaubt
  395.     818 :  Blockschachtelungstiefe zu groß
  396.                 Zu viele verschachtelte FOR- und WITH-Anweisungen (max. 40).
  397.     819 :  Ausdrücke der Argumente zu aufwendig
  398.                 Ausdruck  bei  CALLSYS/CALLEXT  zu  kompliziert.  Aufteilen;
  399.                 Zwischenvariablen verwenden.
  400.     820:  BOOLEAN-Ausdruck zu komplex
  401.                 Vereinfache  den  Ausdruck  durch  Aufteilung  mit  Zwischen~
  402.                 ergebnissen.
  403.     821 :  Argumente sind auf 32 KB Gesamtgröße beschränkt
  404.                 Z.Zt. maximal 32 KB als Wert-Parameter pro Prozedur möglich.
  405.  
  406.  
  407. Interne Fehler. Bei Auftreten bitten wir um Nachricht. Abhilfe folgt prompt.
  408.  
  409.     850:  Funktion noch nicht vollständig implementiert
  410.     851 :  Interner Verifikationsfehler
  411.     852:  Interner Fehler: ...
  412.     853:  Zeitweilige Restriktion: ...
  413.     854:  Interner Fehler: Stack-Pointer sind inkonsistent (Code: ...)
  414.     855:  Interner Fehler: Registerbelegung ist inkonsistent (Code: ...)
  415.     856:  Interner Fehler beim Exportieren eines Aufzählungselements
  416. A.1  Fehlermeldungen des Compilers                                      Anhang
  417. ________________________________________________________
  418.  
  419.  
  420. Fehlermeldungen des Assemblers
  421.  
  422.     901 :  Falsche Adressierungsart
  423.                 Die Adressierungsart ist bei dieser Instruktion nicht zulässig.
  424.     902:  Falsche Operandengröße
  425.                 Die Datengröße ist bei dieser Instruktion nicht zulässig.
  426.     903:  Verzweigung (Bcc/BSR) zu weit
  427.                 Verwende Bcc.W für max. 32768 Byte Sprungweite (Default ist
  428.                 Bcc.B mit max. 128 Byte Sprungweite).
  429.     904:  Unzulässiges Symbol
  430.     905:  Label (Marke) erwartet
  431.                 Sprungziel muß lokales Assembler-Label sein.
  432.     906:  Label ... nicht definiert
  433.                 Benutzte  Labels  müssen  in  derselben  Prozedur  deklariert
  434.                 werden.
  435.     907:  Zahl erwartet
  436.     909:  Ungerade Adresse unzulässig (SYNC verwenden!)
  437.                 Word-  oder  Longword-Zugriff  auf  ungerade  Adresse.  Füge
  438.                 SYNC vorher ein.
  439.     910 :  Modula-Schlüsselwort nicht erlaubt
  440.                 Modula-Schlüsselworte sind auch im Assembler reserviert.
  441.     911 :  Kurze Verzweigung (Bcc/BSR) hier nicht erlaubt
  442.                 Kurzer Sprung über Länge Null nicht zulässig. Verwende Bcc.W.
  443.     912 :  Label (Marke) doppelt deklariert
  444.                 Im selben Block doppelt definiert.
  445.     913 :  Logisch falsche Adressierung (evtl. undeklarierte Variable)
  446.                 Auch  PC-relativer  Zugriff  auf  globales  Objekt  oder  absolute
  447.                 Adressierung eines lokalen Objekts.
  448.     914 :  Fehlerhafter Ausdruck
  449.     916 :  Überlauf des Operanden (auch undefinierte Konstante)
  450.     917 :  68020-Mnemonic nicht erlaubt (verwende $X+)
  451.                 68020-Instruktionen  können  nur  mit  speziell  erweitertem
  452.                 Assembler (erhältlich auf Anfrage) und erst nach der Direktive
  453.                 $X+ verwendet werden.
  454.     918 :  String zu lang
  455.     919 :  Diese Anweisung kann z.Zt. nicht kodiert werden
  456.                 Diese 68010/68020-Instruktion (MOVES) wird nicht übersetzt.
  457.     920:  Unsinnige 68020-Adressierungsart
  458.     921 :  68020 Adressierung nicht erlaubt (verwende $X+)
  459.                 Siehe Fehler 917
  460.     923:  Funktion liefert Ergebnis in D0 -> '/' an Funktionsnamen anfügen!
  461.                 Aufrufe von Funktionen, die mit $Z+ übersetzt wurden, müssen
  462.                 durch Anfügen von '/' kenntlich gemacht werden.
  463.     924:  Innerhalb vom WITH-Block kein Variablenzugriff möglich
  464.                 Innerhalb  eines  WITH  ist  der  Zugriff  auf  die  umgebenden
  465.                 Variablen nicht mehr genau bestimmbar.
  466. A.2  Fehlermeldungen zur Laufzeit                                         Anhang
  467. ________________________________________________________
  468.  
  469.  
  470. A.2  Fehlermeldungen  zur  Laufzeit
  471.  
  472. Allgemeine Laufzeitfehler
  473.  
  474.     -1:    GeneralErr
  475.                   Nicht näher spezifizierter Fehler
  476.     -2:   BusFault
  477.                   Zugriff auf nicht existente Adresse oder geschützten Spei~
  478.                   cherbereich (möglicherweise hat ein Pointer den Wert NIL)
  479.     -3:   OddBusAddr
  480.                   Wortweiser Zugriff auf ungerade Adresse
  481.     -4:   IllegalInstr
  482.                   CPU traf auf unbekannte Instruktion
  483.     -5:   DivByZero
  484.                   Division durch Null
  485.     -6:   OutOfRange
  486.                   ARRAY-Index oder Prozedur-Parameter außerhalb des zuläs~
  487.                   sigen Intervalls
  488.     -7:    Overflow
  489.                   Überlauf bei einer Berechnung
  490.     -8:   StringOverflow
  491.                   String faßt Daten nicht
  492.     -9:   NoValidRETURN
  493.                   Funktions-Prozeduren  müssen  immer  mit  einer  expliziten
  494.                   RETURN-Anweisung enden, die das Ergebnis definiert.
  495.     -10:   OutOfStack
  496.                   Nicht mehr genug Platz zum  Anlegen  lokaler  Variablen  am
  497.                   Beginn eines Prozedurrumpfes.
  498.     -11:   HALTInstr
  499.                   HALT - Breakpoint erreicht
  500.     -12:   FileSystemErr
  501.                   Fehler im Dateisystem
  502.     -13:   OutOfMemory
  503.                   Kein genügender Speicherplatz mehr
  504.     -14:   IllegalCall
  505.                   Unerlaubter Funktionsaufruf
  506.     -15:   CoroutineRtn
  507.                   Coroutinen müssen durch einen TRANSFER beendet werden,
  508.                   nicht durch RETURN oder Erreichen des Prozedurendes.
  509.     -16:   InternalFault
  510.                   Interner Fehler
  511.     -17:   IllegalProcVar
  512.                   Undefinierte PROCEDURE - Variable
  513.     -18:   IllegalPointer
  514.                   Uninitialisierte POINTER - Variable
  515.     -19:   UserBreak
  516.                   Abbruch vom Anwender
  517.     -20:  IllegalState
  518.                   Interner Statusfehler
  519.     -21:   Exception
  520.                   CPU erzeugte diverse Exception
  521.     -22:  GenFPErr
  522.                   Nicht näher bestimmter Floating-Point-Fehler
  523.     -23:  CaseSelectErr
  524.                   Fehlende CASE-Marke oder ELSE-Zweig
  525. A.2  Fehlermeldungen zur Laufzeit                                         Anhang
  526. ________________________________________________________
  527.  
  528.  
  529.     -24:  ConfigErr
  530.                   Konfigurationsfehler, z.B. keine FPU (Koprozessor) vorhanden
  531.     -25:  IllegalClosure
  532.                   Zuweisung lokaler (inaktiver?) Prozedur an Proc-Variable
  533.  
  534. Dateifehler
  535.  
  536.     4:     fNotDeleted
  537.                   bei Directory.Delete: Datei nicht vorhanden
  538.     3:     fWasNotOpen
  539.                   bei Files.Close: Datei war nicht offen
  540.     2:     fEOF
  541.                   Dateiende erreicht
  542.     1:     fEOL
  543.                   Zeilenende erreicht
  544.     0:     fOK
  545.                   Kein Fehler
  546.     -1:    fError
  547.                   Allgemeiner Fehler
  548.     -2:   fDriveNotReady
  549.                   Laufwerk nicht ansprechbar
  550.     -3:   fUnknownCmd
  551.                   Unbekannte Funktion
  552.     -4:   fCRCError
  553.                   Prüfsummenfehler
  554.     -5:   fBadRequest
  555.                   Unerlaubte Funktionsanforderung
  556.     -6:   fSeekError
  557.                   Diskzugriff: Medium defekt
  558.     -7:    fUnknownMedia
  559.                   Diskzugriff: Unbekanntes Format
  560.     -8:   fSectorNotFound
  561.                   Diskzugriff: Sektor nicht vorhanden
  562.     -9:   fNoPaper
  563.                   Drucker: Papier fehlt
  564.     -10:   fWriteFault
  565.                   Diskzugriff: Schreibfehler
  566.     -11:   fReadFault
  567.                   Diskzugriff: Lesefehler
  568.     -12:   fGenError
  569.                   Diskzugriff: Allgemeiner Fehler
  570.     -13:   fWriteProtected
  571.                   Diskzugriff: Schreibschutz aktiv
  572.     -14:   fMediaChanged
  573.                   Diskzugriff: Diskette wurde gewechselt
  574.     -15:   fUnknownDevice
  575.                   Unbekanntes Gerät (bei RWAbs und MediaChange)
  576.     -16:   fBadSectorsOnFormat
  577.                   Fehlerhafte Sektoren beim Formatieren / Verifizieren
  578.     -17:   fInsertOtherDisk
  579.                   Andere Disk (A: <-> B:) einlegen
  580.     -32:  fInvalidFunctionNr
  581.                   Unerlaubte Funktionsnummer
  582.     -33:  fFileNotFound
  583.                   Datei nicht gefunden
  584. A.2  Fehlermeldungen zur Laufzeit                                         Anhang
  585. ________________________________________________________
  586.  
  587.  
  588.     -34:  fPathNotFound
  589.                   Directory nicht gefunden
  590.     -35:  fTooManyOpen
  591.                   Zu viele Dateien geöffnet
  592.     -36:  fAccessDenied
  593.                   Zugriff verwehrt / undurchführbar
  594.     -37:  fInvalidHandle
  595.                   Unerlaubte Zugriffskennung
  596.     -39:  fInsufficientMemory
  597.                   Zu wenig Speicher
  598.     -40:  fInvalidMemBlkAddr
  599.                   Unbekannte Speicherblockadresse
  600.     -46:  fInvalidDrive
  601.                   Unerlaubtes Laufwerk
  602.     -48:  fDiffDrives
  603.                   Rename: Source- und Dest-LW sind verschieden
  604.     -49:  fNoMoreFiles
  605.                   Fsnext(): Keine weiteren Dateien
  606.     -64:  fRangeError
  607.                   Seek: Bereichsüberschreitung
  608.     -65:  fInternalError
  609.                   Interner Fehler
  610.     -66:  fBadFormatOfPrg
  611.                   Illegales Format der Programmdatei
  612.     -67:  fResizeFailure
  613.                   Mshrink: Speicherblock nicht vergrößbar
  614.     -128: fOutOfMem
  615.                   Nicht genügend Speicherplatz frei
  616.     -129: fFileExists
  617.                   Datei existiert schon
  618.     -130: fNoReadAllowed
  619.                   Lesezugriff nicht erlaubt
  620.     -131:  fFileNotClosed
  621.                   Datei noch offen
  622.     -132: fFileNotOpen
  623.                   Datei nicht offen
  624.     -133: fInternalErr1
  625.                   Interner Fehler
  626.     -134: fInternalErr2
  627.                   Interner Fehler
  628.     -136: fBadOp
  629.                   Zugriff in falschem Modus
  630.     -137: fBadAccess
  631.                   Lese- bzw. Schreibzugriff nicht erlaubt
  632.     -138: fEndOfFile
  633.                   Dateiende überschritten
  634.     -139: fDoubleUndo
  635.                   Wiederholter 'UndoRead'-Aufruf
  636.     -140: fNameTooLarge
  637.                   Dateiname ist zu lang
  638.     -141:  fDiskFull
  639.                   Kein Speicherplatz auf Disk mehr
  640.     -142: fIllegalCall
  641.                   Unerlaubter Funktionsaufruf
  642. A.2  Fehlermeldungen des Loaders                                        Anhang
  643. ________________________________________________________
  644.  
  645.  
  646.  
  647. Zur Meldung von Laufzeitfehlern zeigt das Megamax Modula-System ein Fehler~
  648. box, die auch Möglichkeiten zum Suchen der Fehlerposition im Text bietet. Die
  649. Bedienung dieser Box ist im Kapitel 2.5 (Debugger - Suchen der Fehlerposition)
  650. erläutert.
  651.  
  652.  
  653. Fehlermeldungen des Loaders
  654.  
  655. <Modul> nicht vorhanden.
  656. <Modul> beim Importieren in <Klient> nicht gefunden.
  657.  Die Modul-Datei ist weder resident noch auf den Suchpfaden zu finden.
  658. <Modul> ist defekt.
  659.  Das Modul hat fehlerhafte Daten.
  660. Unerlaubte Daten in <Modul>.
  661. Unerlaubtes Layout von <Modul>.
  662.  Die Datei ist entweder kein Modulcode oder der Code eines alten Compilers.
  663. Versionskonflikt zwischen <Modul> und <Client>.
  664.  Die Module wurden nicht mit dem selben Def-Modul übersetzt. (S. Kap. A-10)
  665. Kein ausreichender Speicherplatz mehr.
  666. <Modul> ist resident und schon initialisiert.
  667.  Das Modul kann nicht nochmal als Programm gestartet werden.
  668. Unerlaubter Modulname.
  669. Zu viele verschachtelte Modulaufrufe.
  670.  Maximal 15 verschachtelte CallModule-Aufrufe möglich.
  671. Programm ist nicht ausführbar.
  672.  Die Datei enthält keinen gültigen Progammcode.
  673. Programm nicht gefunden.
  674. Laufzeitfehler während Initialisierung.
  675.  Vor dem Start des Hauptprogramms trat ein Laufzeitfehler auf.
  676. Laufzeitfehler während Deinitialisierung.
  677.  Nach Beendigung des Programms trat ein Laufzeitfehler auf.
  678. <Modul> ist komprimiert.
  679.  Das Modul kann nicht imp. werden, da die erforderlichen Link-Daten fehlen.
  680. <Modul> hat falsches Real-Format.
  681.  Das Modul verwendet ein anderes Real-Format als die zuvor geladenen Module.
  682. <Modul>: FPU nicht vorhanden.
  683.  Das Modul benötigt eine FPU, die nicht im Rechner vorhanden ist.
  684.  
  685.  
  686. Fehlermeldungen des Make
  687.  
  688. Diese finden Sie am  Ende des Kapitels 2 zum Make.
  689. A.3 Interne Datenformate                                                  Anhang
  690. ________________________________________________________
  691.  
  692.  
  693. A.3  Interne  Datenformate
  694.  
  695. Typ               Größe/Bytes      Anmerkungen
  696.  
  697. CARDINAL            2              CARDINAL =  0 .. 0FFFFH 
  698. INTEGER              2              INTEGER =  8000H .. 7FFFH 
  699. CHAR                 1              CHAR =  0C .. 377C 
  700. BOOLEAN            2              FALSE = 0, TRUE = 1
  701. LONGINT             4              LONGINT =   80000000H.. 7FFFFFFFH 
  702. LONGCARD           4              LONGCARD =  0L .. 0FFFFFFFFH 
  703. LONGREAL           8              Format s. unten
  704. REAL                 4              Format s. unten
  705. Aufzählung            2              Zahlwerte 0 .. ORD (MAX(AufzählTyp))
  706. Unterbereich         (*)             Größe wie der Basistyp
  707. Opaque               4
  708. POINTER TO ...      4
  709. BITSET               2              SET OF  0..15 ; Format s. unten
  710. SET                  (*)             Größe = (Elementzahl + 15) DIV 16
  711. LOC                  1
  712. BYTE                 1
  713. WORD                2
  714. LONGWORD          4
  715. ADDRESS            4
  716.  
  717.  
  718. SET-Format  (s. auch Kapitel 3.2)
  719.  
  720. Wir gehen aus von einer Deklaration TYPE MySet = SET OF BaseType. Ein
  721. SET vom Typ MySet enthält dann die Bits 0 .. ORD (MAX (MySet)) sowie evtl.
  722. einige unbenutzte Bits, um das SET auf Bytelänge aufzurunden. (Achtung: Die
  723. Bits ab 0 sind immer enthalten, auch wenn der BaseType ein Unterbereich mit
  724. Untergrenze > 0 ist!). Jedem SET-Element entspricht also ein Bit, das den
  725. Wert 1 bekommt, wenn das Element im SET enthalten ist.
  726.  
  727. Wichtig ist die Anordnung der Bits: Enthält das SET maximal 32 Elemente,
  728. sind diese entsprechend als Bits wie in einem 32 Bit-Wert  (z.B.  Register)
  729. abgelegt. Bei größeren SETs ist die Anordnung undefiniert und kann je nach
  730. Compiler-Version variieren.
  731.  
  732. Das  Setzen  eines  Bits  in  einer  BITSET-Variablen  aus  einem  Assembler~
  733. programm sieht also so aus:
  734.  
  735.    ; *** INCL (BitSetVar, k)    in Assembler
  736.    MOVE.W     BitSetVar, D0         ; Variable ins Register laden
  737.    MOVE.W     k, D1                  ; Index des Elements holen
  738.    BSET         D1, D0                ; Bit / Element setzen
  739.    MOVE.W     D0, BitSetVar         ; Und neuen Wert wieder speichern
  740. A.3 Interne Datenformate                                                  Anhang
  741. ________________________________________________________
  742.  
  743.  
  744. REAL-Formate
  745.  
  746. LONGREALs  werden  in  64  Bit  dargestellt  mit  normalisierter  Mantisse
  747.                                                                +
  748. 0.5 < M < 1.0 und Exponent E zur Basis 2. Also: Longreal =   M * 2 ^ E.
  749.                                                                -
  750.  
  751. Wertebereich:            - 14.6E1240  ..  4.6E1240
  752. relative Genauigkeit:        13.5 Stellen
  753.  
  754.       Bit     Funktion
  755.       63
  756.           6
  757.       ..
  758.              Exponent E (vorzeichenbehaftetes Integer, Basis ist 2)
  759.           6
  760.       51
  761.       50     frei
  762.       49     Zero-Flag:   1 = "Zahl ist ungleich Null"
  763.       48     Vorzeichen:  1 = "Zahl ist negativ"
  764.       47     Mantisse M
  765.           6
  766.        ..
  767.              (außer bei 0.0 stets linksbündig, d.h. Bit 47 = 1.
  768.           6
  769.       00      Bit 47 hat die Real-Wertigkeit 0.5)
  770.  
  771.       Eine Null wird durch gelöschte Bits 48 bis 63 dargestellt.
  772.  
  773. REALs werden in 32 Bit dargestellt mit normalisierter Mantisse 0.5 < M < 1.0,
  774. invertiertem  Vorzeichen  S  und  Exponent  E  zur  Basis  2  mit  Bias  64.
  775. Also: Real-Wert = NOT (S) * M * 2^(E-64).
  776.  
  777. Wertebereich:            - 9.2E18 .. 9.2E18
  778. relative Genauigkeit:        7 Stellen
  779.  
  780.       Bit     Funktion
  781.       31     Mantisse M
  782.           6
  783.        ..
  784.              (kann auch denormalisiert sein, d.h.  Bit 31 muß nicht gesetzt sein;
  785.           6
  786.        8      Bit 31 hat die Real-Wertigkeit 0.5)
  787.        7     invertiertes Vorzeichen:  0 = "Zahl ist negativ"
  788.        6
  789.           6
  790.       ..
  791.              Exponent E (vorzeichenbehaftetes Integer, Basis ist 2, Bias 64)
  792.           6
  793.        0
  794.       Sind alle 32 Bit gelöscht, wird 0.0 dargestellt.
  795.  
  796.  
  797. Hinweis:
  798.   Bei Verwendung des Mathe-Koprozessors (FPU) werden die IEEE-Formate
  799.   für 64 und 32 Bit statt der hier beschriebenen verwendet!
  800.  
  801.   Die Konvertierung zwischen beiden Formaten kann mit dem Modul RealCtrl
  802.   erfolgen.
  803. A.4  Registerbelegung zur Laufzeit                                        Anhang
  804. ________________________________________________________
  805.  
  806.  
  807. A.4  Registerbelegung  zur  Laufzeit
  808.  
  809.         D0..   Zwischenspeicher (können in Assemblerteilen benutzt werden,
  810.        D2                        behalten jedoch i. a. ihre Werte nicht)
  811.         D3..   Zwischenspeicher, müssen bei  Rückkehr aus Prozeduren
  812.         D7                        ihren alten Wert wieder enthalten!
  813.        A0     Zwischenspeicher
  814.        A1     Zwischenspeicher
  815.        A2     Zwischenspeicher
  816.        A3     reserviert - Zeiger auf Parameter-Stack
  817.        A4     muß nach Rückkehr aus Prozeduren alten Wert  enthalten!
  818.        A5     reserviert - Verwaltung der lokalen Variablen
  819.        A6     reserviert - Zeiger auf aktuelle lokale Variablen
  820.        A7     reserviert - Zeiger auf CPU-Stack
  821. A.5 Übersicht Compileroptionen                                            Anhang
  822. ________________________________________________________
  823.  
  824.  
  825. A.5   Übersicht:  Compileroptionen
  826.  
  827.  
  828. Syntax-Beispiel:  (*$ R-, S-  Kommentar: alle Prüfungen aus *)
  829.  
  830. Schalter
  831.  
  832.      Vor-
  833. Name      Bedeutung               Erläuterungen
  834.     einst
  835.  A -  Erweiterte Syntax   A+ lockert einige Syntax-Regeln.
  836.  B  -  Body Requirement    B+  verhindert  das  Entfernen  des  Modulkörpers
  837.                                 beim optimierten Linken
  838.  C +  Case Sensitivity      C-  hebt Unterscheidung von Groß-/Kleinschrift auf
  839.  D -  Debugging            D+  erzeugt Zusatzcode zur Fehlersuche
  840.  E  -  Procedure Trace     E+ erzeugt Code zur Anzeige von Prozeduraufrufen
  841.  F  -  Float-Format         F+ dient zur Verwendung einer FPU
  842.  H -  Local Procedures    H+ erlaubt lokale Prozeduren als Parameter
  843.  I  -  Integer-Size         I+ ordnet CARDINAL/INTEGER den LONG-Typen zu
  844.  J  +  Optimized Code      J- verhindert evtl. kritische Optimierungen
  845.  K  -  Long-Short-Assign  K+ erlaubt Zuweisung von Long- auf Short-Variable
  846.  L  +  Parameter Linking   L-  erlaubt Parameterübernahme von Assembler
  847.  M +  Prozedurnamen      M- spart Platz, aber Prozedurnamen können dann
  848.                                 nicht mehr bei Fehlern angezeigt werden. Beim
  849.                                 vollst. optimierten Linken werden alle Prozedur~
  850.                                 namen automatisch entfernt.
  851.  N -  No Runtime          N+ verhindert den autom. Runtime-Import
  852.  P  +  Protokoll             P-  nimmt Programmteile aus dem Protokoll aus
  853.  Q -  Quiet Compilation    Q+ schaltet Ausgaben beim Übersetzen ab
  854.  R  +  Range Checking      R-  spart Code für Bereichsprüfungen
  855.  S +  Stack Checking      S- spart Code für Stackplatz-Prüfungen;
  856.                               S 512 setzt geforderte Stackplatz-Reserve
  857.  T  +  Record Ordering     T- reiht Felder mit Kommataaufzählung rückwärts
  858.  U +  Set Format          U- wählt altes SET-Format (Compiler Version 3)
  859.  V -  Verbose Protocol    V+ erzeugt Statistik am Ende der Protokolldatei
  860.  W +  Warnings            W- verhindert Fehlermeldung bei REF-Parametern
  861.  X -  Extended Asm       X+ erlaubt 68020 & 68881 Mnemonics (nur  bei
  862.                                 erweitertem Compiler / Assembler)
  863.  Y -  System-Module      Y+ erlaubt "shared data"
  864.  Z -  Value Return Mode  Z+ läßt Funktionsergebnisse im Register liefern.
  865.  
  866. Sonstige Direktiven
  867.  
  868.  E      Extension           E xyz  setzt Endung der Codedatei auf '.xyz'
  869.  I       Include              I filename  fügt Datei filename ein
  870.  U      Uses Library        U path  läßt Definitionsmodule auf path suchen
  871.  ?       Conditional Comp.  ?constExpr:  übersetzt Folgendes nur bedingt
  872.  Reg    Register Variable   Läßt Variable bevorzugt im Register ablegen
  873. A.6 Backus-Naur-Notation                                                 Anhang
  874. ________________________________________________________
  875.  
  876.  
  877.  
  878. A.6  Backus-Naur-Notation
  879.  
  880. Zur Beschreibung der Syntax einer Programmiersprache eignet sich neben den
  881. grafischen Syntaxdiagrammen die sogenannte 'Erweiterte  Backus-Naur-Form'
  882. (EBNF).  In  diesem  Handbuch  finden  Sie  eine  vollständige  Modula-Syntax~
  883. beschreibung sowohl als Diagramme (Anhang A.7) als auch in EBNF (Anhang
  884. A.8); in den Kapiteln 3 und 4 zitieren wir gelegentlich einzelne Elemente der
  885. Syntax nur in EBNF. Außerdem finden Sie im Anhang A.9 eine Darstellung der
  886. Codefile-Formate in EBNF. Sie sollten sich also im folgenden schnell mit der
  887. EBNF vertraut machen, falls Sie sie bisher nicht verwenden:
  888.  
  889. Ein  Programm  besteht  aus  syntaktischen  Einheiten,  z.B.  Schlüsselworten,
  890. Zeichen, oder auch aus einer Folge oder mehrfachen Wiederholung einfacherer
  891. Syntaxeinheiten. Die EBNF erlaubt die Beschreibung solcher Konstrukte.
  892.  
  893. * Besteht das Konstrukt A aus der Aneinanderreihung der Konstrukte B und C,
  894. so lautet seine Beschreibung in EBNF A = BC. (Wer hätte das gedacht ?!)
  895.  
  896. * Besteht A aus B oder (alternativ) aus C, wird es als A = B|C beschrieben.
  897. Sind B oder C ihrerseits zusammengesetzt, etwa in Form einer Aneinander~
  898. reihung,  und  soll  diese  Form  ausgeschrieben  werden,  dann  müssen  runde
  899. Klammern gesetzt werden. Beispiel: A = B| (DE). - A besteht aus B oder aber
  900. der Folge DE.
  901.  
  902. * Außerdem kann EBNF eine Option beschreiben: A =  B  bedeutet: A besteht
  903. aus B oder gar nichts (leeres Konstrukt).
  904.  
  905. * Schließlich gibt es die Möglichkeit der Wiederholung: A =  B  besagt: A
  906. besteht aus beliebig oft wiederholter Aneinanderreihung von B. Auch nullmalige
  907. Wiederholung (also A als leeres Konstrukt) ist hier erlaubt!
  908.  
  909. * Bei der Beschreibung der Modula-Syntax hat es sich eingebürgert, daß die
  910. Schlüsselworte groß geschrieben werden (wie ja auch in Modula selbst), während
  911. zusammengesetzte  Konstrukte  Namen  in  gemischter  Groß-/Kleinschreibung
  912. bekommen. Satzzeichen, die in Modula vorkommen, werden in Anführungszeichen
  913. geschrieben, damit man sie von den EBNF-Zeichen unterscheiden kann.
  914.  
  915. Um mit der EBNF vertraut zu werden, sollten Sie sich in den folgenden Abschnit~
  916. ten A.7 und A.8 einige Konstrukte in grafischer und EBNF-Darstellung ansehen
  917. und vergleichen.
  918. A.7 Modula-Syntaxdiagramme                                              Anhang
  919. ________________________________________________________
  920.  
  921.  
  922. A.7    Modula-Syntaxdiagramme
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.           Aus technischen Gründen müssen Sie leider diesmal auf die
  939.               Syntaxdiagramme verzichten. Wir geloben Besserung.
  940. A.8  Modula-Syntax in EBNF                                               Anhang
  941. ________________________________________________________
  942.  
  943.  
  944. A.8    Modula-Syntax  in   EBNF
  945.  
  946. ident                  = letter  letter | digit .
  947. number               = integer | longInt | real.
  948. integer                = digit  digit  | octalDigit  octalDigit  ('B'|'C') |
  949.                           digit  hexDigit  'H' | '$' hexDigit  hexDigit .
  950. longInt                = integer ('L'|'D').
  951. real                   = digit  digit  '.'  digit   ScaleFactor .
  952. ScaleFactor           = 'E'  '+'|'-'  digit  digit .
  953. hexDigit               = digit | 'A'|'B'|'C'|'D'|'E'|'F'.
  954. digit                   = octalDigit | '8'|'9'.
  955. octalDigit              = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'.
  956. string                 = ""  character  "" | ' '  character  ' '.
  957.                           '               '    "              "
  958. qualident              = ident  '.' ident .
  959. ConstantDeclaration   = ident '=' ConstExpression.
  960. ConstExpression      = expression.
  961. TypeDeclaration       = ident '=' type.
  962. type                   = SimpleType | ArrayType | RecordType | SetType |
  963.                           PointerType | ProcedureType.
  964. SimpleType            = qualident | enumeration | SubrangeType.
  965. enumeration           = '(' IdentList ')'.
  966. IdentList              = ident  ',' ident .
  967. SubrangeType         =  qualident 
  968.                           ' ' ConstExpression '..' ConstExpression ' '.
  969. ArrayType             = ARRAY SimpleType  ',' SimpleType  OF type.
  970. RecordType           = RECORD FieldListSequence END.
  971. FieldListSequence     = FieldList  ';' FieldList .
  972. FieldList               =  IdentList ':' type |
  973.                           CASE  ident  ':' qualident OF variant  '|' variant 
  974.                            ELSE FieldListSequence  END .
  975. variant                =  CaseLabelList ':' FieldListSequence .
  976. CaseLabelList         = CaseLabels  ',' CaseLabels .
  977. CaseLabels            = ConstExpression  '..' ConstExpression .
  978. SetType               = SET OF SimpleType.
  979. PointerType           = POINTER TO type.
  980. ProcedureType        = PROCEDURE  FormalTypeList .
  981. FormalTypeList        = '('    VAR|REF  FormalType
  982.                                ','  VAR|REF  FormalType    ')'  ':' qualident .
  983. VariableDeclaration   = IdentList ':' type.
  984. designator            = qualident  '.' ident | ' ' ExpList ' ' | '^' .
  985. ExpList                = expression  ',' expression .
  986. expression            = SimpleExpression  relation SimpleExpression .
  987. relation               = '='|'#'|'<>'|'<'|'<='|'>'|'>='| IN.
  988. AddOperator          = '+' | '-' | OR.
  989. MulOperator          = '*' | '/' | DIV | MOD | AND | '&'.
  990. SimpleExpression     =  '+' | '-'  term  AddOperator term .
  991. A.8  Modula-Syntax in EBNF                                               Anhang
  992. ________________________________________________________
  993.  
  994.  
  995. term                  = factor  MulOperator factor .
  996. factor                 = number | string | valueConstrutor | '(' expression ')' |
  997.                           designator  ActualParameters  | NOT factor|~factor.
  998. valueConstructor      = recordConstructor | arrayConstructor | setConstructor.
  999. setConstructor        =  qualident  setDefinition.
  1000. setDefinition          = ' '  member  ',' member   ' '.
  1001. member               = expression  '..' expression .
  1002. recordConstructor    = qualident recordDefinition.
  1003. recordDefinition       = ' ' element  ',' element  ' '.
  1004. arrayConstructor     = qualident arrayDefinition.
  1005. arrayDefinition        = ' ' repeatedElem  ',' repeatedElem  ' '.
  1006. repeatedElem         = element   BY ConstExpression  .
  1007. element               = expression | arrayDefinition | recordDefinition |
  1008.                           setDefinition.
  1009. ActualParameters     = '('  ExpList  ')'.
  1010. statement             =  assignment | ProcedureCall | IfStatement |
  1011.                           CaseStatement | WhileStatement | RepeatStatement |
  1012.                           LoopStatement | ForStatement | WithStatement |
  1013.                           AssemblerStatement | EXIT | RETURN  expression  .
  1014. assignment            = designator ':=' expression.
  1015. ProcedureCall         = designator  ActualParameters .
  1016. StatementSequence   = statement  ';' statement .
  1017. IfStatement           = IF expression THEN StatementSequence
  1018.                            ELSIF expression THEN StatementSequence  
  1019.                            ELSE StatementSequence   END.
  1020. CaseStatement       = CASE expression OF case  '|' case 
  1021.                            ELSE StatementSequence  END.
  1022. case                  =  CaseLabelList ':' StatementSequence .
  1023. WhileStatement       = WHILE expression DO StatementSequence END.
  1024. RepeatStatement      = REPEAT StatementSequence UNTIL expression.
  1025. ForStatement         = FOR ident ':=' expression TO expression
  1026.                            BY ConstExpression  DO StatementSequence END.
  1027. LoopStatement        = LOOP StatementSequence END.
  1028. WithStatement        = WITH designator DO StatementSequence END.
  1029. AssemblerStatement  = ASSEMBLER AssemblerLine  AssemblerLine  END.
  1030. AssemblerLine        =  ident   OpCode  Operand  .
  1031. ProcedureDeclaration = ProcedureHeading ';' block ident.
  1032. ProcedureHeading     = PROCEDURE ident  FormalParameters .
  1033. ForwardDeclaration   = FORWARD ident  Formalparameters  |
  1034.                           ProcedureHeading ';' FORWARD.
  1035. block                  =  declaration   BEGIN StatementSequence  END.
  1036. declaration            = CONST  ConstantDeclaration ';'  |
  1037.                           TYPE  TypeDeclaration ';'  |
  1038.                           VAR  VariableDeclaration ';'  |
  1039.                           ProcedureDeclaration ';' | ForwardDeclaration ';' |
  1040.                           ModuleDeclaration ';'.
  1041. A.8  Modula-Syntax in EBNF                                               Anhang
  1042. ________________________________________________________
  1043.  
  1044.  
  1045. FormalParameters    = '('  FPSection  ';' FPSection   ')'  ':'qualident .
  1046. FPSection             =  VAR|REF  IdentList ':' FormalType.
  1047. FormalType           =  ARRAY OF | LONGARRAY OF  qualident.
  1048. ModuleDeclaration     = MODULE ident  priority  ';'  import   export 
  1049.                           block ident.
  1050. priority                = ' ' ConstExpression ' '.
  1051. export                = EXPORT  QUALIFIED | PERVASIVE   IdentList ';'.
  1052. import                =  FROM ident  IMPORT IdentList ';'.
  1053. DefinitionModule       = DEFINITION MODULE ident ';'  import   export 
  1054.                            definition  END ident '.'.
  1055. definition              = CONST  ConstantDeclaration ';'   |
  1056.                           TYPE  ident  '=' type  ';'  |
  1057.                           VAR  VariableDeclaration ';'  |
  1058.                           ProcedureHeading ';'.
  1059. ProgramModule       = MODULE ident  priority  ';'  import  block ident '.'.
  1060. CompilationUnit       = DefinitionModule |  IMPLEMENTATION  ProgramModule.
  1061. A.9  Aufbau der Codemodule                                              Anhang
  1062. ________________________________________________________
  1063.  
  1064.  
  1065. A.9  Aufbau  der  Codemodule
  1066.  
  1067.  
  1068. Hinweise zur Notation und verwendeten Begriffen:
  1069.  
  1070. Zur Beschreibung des Formats wird eine Art Backus/Naur-Notation verwendet:
  1071. In  geschweiften Klammern  stehen Teile, die beliebig oft wiederholt werden
  1072. können (auch null Mal). In  eckigen Klammern  stehende Teile können einfach
  1073. oder gar nicht auftreten.
  1074.  
  1075. Durch  "^Objekt"  wird  ein  Pointer  auf  das  Objekt  bezeichnet.  Wenn  nicht
  1076. anders angegeben, ist der Wert des Pointers stets relativ zum Anfang des
  1077. Moduls zu verstehen.
  1078.  
  1079. Der "Key" eines Moduls wird vom Compiler vergeben, um verschiedene Versionen
  1080. eines Moduls unterscheiden zu können. Er wird beim Übersetzen eines Definitions~
  1081. modules errechnet  und  aus  dem  Definitionsmodul  sowohl  in  die  zugehörige
  1082. Implementation als auch in alle Klienten-Module übernommen.
  1083.  
  1084. Der "linearisierte Baum" im Definitionsmodul enthält die Beschreibungen  der
  1085. exportierten Objekte.
  1086.  
  1087. Ein "Item" bezeichnet ein beliebiges Objekt aus dem linearisierten Baum. Items
  1088. können  z.B.  Variablen,  Typen,  Prozeduren,  Konstanten  beschreiben.  Items
  1089. werden "anonym" eingetragen, wenn der Programmierer ihnen keine expliziten
  1090. Namen gegeben hat (etwa bei Typbeschreibungen, die direkt in einer Variablen~
  1091. deklaration  angegeben  werden).  Die  "Item-Nr"  wird  beim  Linearisieren  des
  1092. Baums durch Abzählen vergeben.
  1093.  
  1094. Achtung: Seit Compiler-Version 3.7 wird vor dem eigentlichen Modulcode noch
  1095. eine Kennung abgelegt, um die Dateien eindeutig identifizieren zu können. Bei
  1096. allen vom Compiler erzeugten Dateien ist diese Kennung acht Zeichen lang, und
  1097. sie enthält den Text "MM2Code", abgeschlossen mit einem Null-Zeichen.
  1098. A.9  Aufbau der Codemodule                                              Anhang
  1099. ________________________________________________________
  1100.  
  1101.  
  1102. Format von Programm-/Implementations-Modulen:
  1103.  
  1104. Format des Modulkopfes:
  1105.  
  1106.     8 byte   Datei-Kennung        "MM2Code" (gehört nicht zum Modul)
  1107.     1 byte   Layout Nr.            2 seit Compiler 3.6, erhöht bei
  1108.                                      Änderung des Modulformats
  1109.     1 byte   Kennung               Bits 0-1: 1 = Programm
  1110.                                                2= Implementation
  1111.                                      Bit 4:    1 = Prozedurnamen im Code
  1112.                                      Bit 5-6  0 = keine Reals, 1= MM2-Reals,
  1113.                                                2 = ST-FPU, 3= TT-FPU.
  1114.                                      Bit 7:    1 = 68020/881 Instr. im Code
  1115.     4 byte   Key                    Versionsschlüssel, Dummy bei Pgm-Modul
  1116.     4 byte   ^ Modul-Rumpf       StartAdr bei Ausführung
  1117.     4 byte   ^ Modul-Ende         Platz für nächstes Modul
  1118.     4 byte   ^ Import-Liste        (s.u.)
  1119.     4 byte   ^ Export-Liste        (s.u.)
  1120.     4 byte   ^ Relozier-Liste       auch Start der glob. Variablen
  1121.      4 byte   ^ Sourcefile-Namen   Name des zugehörigen Quelltextes
  1122.      4 byte   ^ Modulnamen        Name aus dem Programmkopf
  1123.      4 byte   ^ Symbolfile-Namen   z. Zt. unbenutzt, immer Null
  1124.     4 byte   ^ Proc-Längen-Liste  Länge jeder globalen Prozedur
  1125.     4 byte   ^ Code-Start         Ende des Headers
  1126.     4 byte   Options               Options, die während des Übersetzen aktiv
  1127.                                      waren (hierüber erfährt der Linker beispiels-
  1128.                                      weise die Einstellung der $B-Option)
  1129.        ...     Modul-, Source-, Symbolname
  1130.               Importliste
  1131.                Export-Liste 
  1132.               Modul-Code
  1133.               Relozier-Liste
  1134.               Proc-Längen-Liste
  1135.  
  1136.  
  1137. Format der Modul-, Source- und Symbolfile-Namen:
  1138.  
  1139.      1 byte   Name in ASCII-Bytes
  1140.      1 byte   Endmarke 0
  1141. A.9  Aufbau der Codemodule                                              Anhang
  1142. ________________________________________________________
  1143.  
  1144.  
  1145. Format der Import-Liste (Pgm/Impl.Modul):
  1146.  
  1147.     4 byte    Key des importierten Moduls
  1148.   2*n byte   Name des Moduls  $FE  $FF
  1149.  
  1150.     2 byte    Item-Nr. des Imports (nur Variablen/Prozeduren sind enthalten)
  1151.     4 byte   ^ letzte Referenz auf importiertes Item
  1152.     2 byte   Endmarke $0000
  1153.  
  1154.     4 byte   Endmarke $00000000
  1155.  
  1156.  
  1157. Format der Export-Liste (Impl.Modul):
  1158.  
  1159.     2 byte    Item-Nr
  1160.     4 byte   Adresse des Items (rel. zum Modulanfang, nur Variablen
  1161.               und Prozeduren stehen in der Exportliste)
  1162.     2 byte   Endmarke $0000
  1163.  
  1164.  
  1165. Format der Relozier-Liste für Variablen/Prozeduren:
  1166.  
  1167.     4 byte    ^ letzte Referenz
  1168.     4 byte   Adresse, rel. zum Modulanfang
  1169.     4 byte   Endmarke $00000000
  1170.  
  1171.  
  1172. Anmerkungen:
  1173.  
  1174. - bei Programmmodulen ist der Pointer auf die Exportliste = 0.L
  1175.  
  1176. - bei Implementationen ohne Export besteht die Exportliste nur aus der
  1177.   Endmarke = 0.W
  1178. A.9  Aufbau der Codemodule                                              Anhang
  1179. ________________________________________________________
  1180.  
  1181.  
  1182. Format von Definitions-Modulen:
  1183.  
  1184. Format des Modulkopfes:
  1185.  
  1186.    8 byte    Datei-Kennung        "MM2Code" (gehört nicht zum Modul)
  1187.    1 byte     Layout Nr.             5 seit Compiler 4.0, erhöht bei
  1188.                                      Änderung des Modulformats
  1189.    1 byte     Kennung               immer 3 = DefModul
  1190.    2 byte    Qualification Flag      1 = qualified | (auch Module ohne EXPORT)
  1191.                                      2 = pervasive |
  1192.                                      0 = unqualified
  1193.    4 byte     Key
  1194.    4 byte    ^ linearisierten Baum (relativ zum Modulanfang)
  1195.    2 byte     Anzahl der definierten Items
  1196.    4 byte    ^ Import-Liste (relativ zum Modulanfang)
  1197.    4 byte    Platzbedarf der definierten Variablen
  1198.    4 byte    ^ Modulnamen
  1199.    4 byte    ^ Ende des Headers
  1200.    4 byte    ^ Source-Name
  1201.      ...      Modulname (Format wie in Implementationsmodulen),
  1202.              Importliste, linearisierter Baum
  1203.  
  1204.  
  1205. Format der Import-Liste (Def.Modul):
  1206.  
  1207.     4 byte   Key des importierten Moduls
  1208.     2 byte   Anzahl der im importierten Modul definierten Items
  1209.  
  1210.     2 byte   Item-Nr. des Imports (bit 15 = "Item ist Var/Proc")
  1211.     2 byte   eigene Item-Nr. für dieses Item
  1212.     2 byte   Endmarke $0000
  1213.  
  1214.     4 byte   Endmarke $00000000
  1215.  
  1216.  
  1217. Format des linearisierten Baumes:
  1218.  
  1219.     2 byte    Item-Nr. des folgenden Items
  1220.               (bit 15 = "dieses Objekt wird exportiert")
  1221.     2 byte   ^nächste Item-Nr.
  1222.               (relativ zur Position dieses ^)
  1223.   2*n byte   Name des Items  $FE  $FF
  1224.               (Name leer bei anonymen Einträgen, $FE dient als Sync)
  1225.     2 byte   Kennung (s.u.)
  1226.   2*m byte  Item-Beschreibung (s.u.)
  1227.     2 byte    Endmarke $0000
  1228. A.9  Aufbau der Codemodule (Beschreibung der Items)                   Anhang
  1229. ________________________________________________________
  1230.  
  1231.  
  1232. Beschreibung der Items im linearisierten Baum:
  1233.  
  1234. Das erste Byte der Kennung enthält acht Flag-Bits:
  1235.   Bit 7    benutzerdefiniertes Item (also kein Standard-Symbol)
  1236.   Bit 6    exportiertes Item
  1237.   Bit 5    importiertes Item
  1238.   Bit 4    bei Variablen: Externe Variable  (feste Adresse)
  1239.   Bit 3    bei lokalen Variablen: REF-/VAR-Parameter
  1240.            bei Prozeduren: Parameter auf A7 statt A3 übergeben
  1241.   Bit 2    Item ist ein Typ-Descriptor (gelöscht bei impliziten Typen o. Name)
  1242.   Bit 1    globales Item;
  1243.   Bit 0    bei Types: skalarer Typ;
  1244.            bei Variablen: schreibgeschützt (z.B. REF-Parameter)
  1245.  
  1246. Das andere Byte gibt die Typ-Nr. des Items an.
  1247.  
  1248. Aufbau der einzelnen Item-Beschreibungen:
  1249.  
  1250. Art           Typ-Nr.
  1251. ______________________________________________________
  1252.      8
  1253. Relay          |  0 | ^eigentliche Item-Beschreibung |
  1254. LONGINT      |  1  | Größe.L |
  1255. LONGREAL    |  2 | Größe.L |
  1256. CHAR         |  3 | Größe.L |
  1257.     1
  1258. ZZ            |  4 | Größe.L |
  1259.            7
  1260. SET OF ...    |  5 | Größe.L | ^ElementTyp |
  1261. Prozedur      |  6 | Adr.L | ^1.Parameter | ^ResultTyp | dummy.L |
  1262.                                                                            2
  1263. Parameter    |  7 | ^nächster Parameter | ^ParamterTyp | ParFlags.W   |
  1264.         3
  1265. Opaque       |  8 | Größe.L |
  1266. Enumeration  |  9 | Größe.L | Anzahl Elemente.L | ^1.Element |
  1267. Enum-Element| 10 | OrdWert.W | ^Enum-Typ | ^nächstes Element |
  1268. Subrange     | 11  | Größe.L | Untergrenze.L | Obergrenze.L | ^BasisTyp |
  1269. ARRAY ...     | 12 | Größe.L | ^IndexTyp | ^ElementTyp |
  1270. RECORD ...   | 13 | Größe.L | ^erstes Feld | <^lokaler Baum der Felder> |
  1271. RECORD-Feld | 14 | relAdr.L | ^Typ | ^nächstes Feld |
  1272. Lok. Modul    | 15 | ^lok.Baum |            (nur Compiler-intern verwendet)
  1273. Qualifier      | 16 | ^lok.Baum |            (nur Compiler-intern verwendet)
  1274.                                                     6
  1275. Variable       | 17 | Adr.L | ^VarTyp | dummy.L |   VarFlags.B | UsedDepth.B |
  1276. Konstante     | 18 | ^Typ | Größe.W | Wert... (in Long-Portionen) |
  1277. Prozedur-Typ | 19 | Größe.L | ^1.Parameter | ^ResultTyp |
  1278. POINTER...    | 20 | Größe.L | ^BasisTyp |
  1279. WORD        | 21 | Größe.L |
  1280. LONGCARD   | 22 | Größe.L |
  1281. ADDRESS     | 23 | Größe.L | ^BasisTyp |
  1282. BOOLEAN     | 24 | Größe.L |
  1283.         4
  1284. Opaque       | 25 | Größe.L |
  1285. LONGWORD  | 26 | Größe.L |
  1286. String         | 27 | Größe.L | Zeichenzahl.L |
  1287. TABLE...      | 28 | Adr.L |
  1288. Asm-Label    | 29 | ...                     (nur Compiler-intern verwendet)
  1289. LongBoth      | 30 | Größe.L |
  1290. String-Const  | 31 | Zeichenzahl.B |  char.B  |
  1291. Open-Array   | 32 | ^ElementTyp |
  1292. INTEGER      | 33 | Größe.L |
  1293. CARDINAL    | 34 | Größe.L |
  1294. ShortBoth     | 35 | Größe.L |
  1295. A.9  Aufbau der Codemodule (Beschreibung der Items)                   Anhang
  1296. ________________________________________________________
  1297.  
  1298.  
  1299. Std-Funktion  | 36 | F-Nr.W |              (nur Compiler-intern verwendet)
  1300. Std-F.-Parm  | 37 | ...                     (nur Compiler-intern verwendet)
  1301. BYTE          | 38 | Größe.L |
  1302. BYTE(signed)  | 39 | Größe.L |              (nur Compiler-intern verwendet)
  1303. REAL          | 40 | Größe.L |
  1304. BITNUM       | 41 | Größe.L |
  1305. LongOpen-Arr| 42 | ^ElementTyp |
  1306. Any Type      | 43 | Größe.L |              (nur Compiler-intern verwendet)
  1307.           5
  1308. Proc-Typ      | 44 | Größe.L | ^Proc-Typ (m. Kennung 19) |
  1309.             7
  1310. SET OF ...    | 45 | Größe.L | ^ElementTyp |
  1311. Tag-Feld      | 46 | ^REC-Feld | Untergrenze.L | Obergrenze.L | ^Tag-Feld |
  1312. REC-Variante | 47 | dummy.L | ^Typ | ^nächstes Feld | ^REC-Feld | ^Tag-Feld |
  1313.  
  1314. Anmerkungen:
  1315. 1)  Der Typ ZZ ist nur für ordinale Konstanten vorgesehen: Er umfaßt den
  1316.    Bereich von MIN (LONGINT) bis MAX (LONGCARD) und besteht deshalb aus
  1317.    33 signifikanten Bits. Der Wert liegt im Baum als ein Record aus einem
  1318.    WORD und einem LONGWORD-Wert. Ist das WORD Null, ist der Long-
  1319.    Wert als LONGINT, sonst als LONGCARD zu interpretieren.
  1320. 2) Bit 8 gesetzt -> Parameter ist "VAR"-Parameter
  1321.    Bit 9 gesetzt -> Parameter ist "REF"-Parameter
  1322.    Bit 7 gesetzt -> Bits 0-5 enthalten Reg-Nr, in der das Arg. übergeben wird.
  1323. 3) Beschreibt einen im eigenen Modul definierten opaquen Typ (Compiler-intern).
  1324. 4) Beschreibt einen ex-/importierten opaquen Typ.
  1325. 5) Der Prozedur-Typ mit der Nr. 44 ist für value-Parameter vorgesehen, die
  1326.    auch eine Zuweisung von lokalen Prozeduren erlauben (Größe: 8 Byte).
  1327. 6) "VarFlags" und "UsedDepth" sind nur im Compiler temporär vorhanden.
  1328.    Die Bits in VarFlags:
  1329.       Bit 7: Reg-Var; Bit 6: z.Zt. im Reg; Bit 5: dirty; Bit 0..4: Reg-Nr.
  1330.    In UsedDepth wird der tiefste Scope-Level aller Zugriffe gespeichert.
  1331. 7) SETs mit Kennung 45 kommen nur bei Größen bis 32 Bit vor. Die Kennung
  1332.    5 beschreibt die größeren SETs mit byteweiser Anordnung (kommt aber
  1333.    durch die Direktive $U- auch bei SETs unter 32 Bit vor).
  1334. 8) Sog. Relays entstehen, wenn beispielsweise zuerst die Originalbeschreibung
  1335.    anonym, also namenlos, in den Baum eingetragen wird und später der Name
  1336.    doch benötigt und nachgetragen wird: Dann wird der Name zusammen mit
  1337.    der Relay-Kennung und dem Verweis auf die eigentliche Beschreibung im
  1338.    Baum angefügt.
  1339.  
  1340.  * Die "Größe" gibt bei Types ihre Länge in Bytes an. Sie ist in der Regel
  1341.    konstant.
  1342.  * ".L" bedeutet einen Long-Wert (4 Byte), ".W" einen Word-Wert (2 Byte)
  1343.    und ".B" einen Byte-Wert.
  1344.  * Die mit "^" bezeichneten Einträge sind Word-Daten (2 Byte) und verweisen
  1345.    auf die Item-Nummer der zugehörigen Beschreibung.
  1346.  * Item-Nummern mit dem Wert "0" bedeuten, daß das betreffende Item nicht
  1347.    verwendet wird.
  1348. A.9  Aufbau der Codemodule (Relozieren und Linken)                     Anhang
  1349. ________________________________________________________
  1350.  
  1351.  
  1352. Das Relozieren:
  1353.  
  1354. Der  68000-Prozessor  bietet  zwar  für  alle  Befehle   auch   PC-relative
  1355. Adressierung an, leider ist dabei der Bereich auf +/- 32 KB beschränkt, so
  1356. daß größere Programme oder Datenmengen darüber nicht adressiert werden
  1357. können. Deshalb verwendet der Modula-Compiler zur Adressierung von globalen
  1358. Prozeduren und Variablen die absolute Adressierung.
  1359.  
  1360. Natürlich ist während des Übersetzungsvorgangs nicht bekannt, wo das Modul
  1361. später im Speicher liegen wird. Daher können die absoluten Adressen noch
  1362. nicht berechnet werden. Stattdessen werden die 32 Bit, die bei jedem Aufruf
  1363. für  die  Adresse  zur  Verfügung  stehen,  zum  Anlegen  einer  Zeigerkette
  1364. verwendet. Sie enthält jeweils einen Verweis auf die vorrige Referenz auf die
  1365. selbe angesprochene Prozedur/Variable. Für jede globale Var/Proc zieht sich
  1366. also eine Zeigerkette rückwärts durch die Code-Datei. Am Ende der Code-
  1367. Datei wird dann eine Relozierkette angehängt, die wiederum für jede Var/Proc
  1368. einen Zeiger auf den Anfang der zugehörigen Zeigerkette sowie ihre relative
  1369. Adresse enthält.
  1370.  
  1371. Beim Laden des Moduls geht der Loader die Relozierkette durch, indem er aus
  1372. der  (nun  bekannten)  Startadresse  des  Moduls  und  der  relativen  Adresse
  1373. jeweils die absolute Lage der Var/Proc bestimmt. Dann wird die Zeigerkette
  1374. verfolgt und alle Zeiger werden durch diese Adresse ersetzt. Nachdem die
  1375. gesamte Relozierkette abgearbeitet ist, kann sie durch Variablen oder weitere
  1376. Module überschrieben werden.
  1377.  
  1378. Das Linken:
  1379.  
  1380. Wenn  ein  Programm  aus  mehreren  Modulen  besteht,  die  untereinander
  1381. Prozeduren oder Variablen austauschen, müssen die Adressen der importierten
  1382. Objekte ebenfalls vor dem Start des Programms nachgetragen werden.
  1383.  
  1384. Dazu werden - genau wie beim  Relozieren  der  eigenen  Vars/Procs  -  alle
  1385. Referenzen auf diese Objekte zunächst  durch  Zeigerketten  verbunden.  Hier
  1386. kann der Compiler aber nun nicht feststellen, auf welcher relativen Adresse
  1387. die Objekte im importierten Modul liegen (die Implementation des importierten
  1388. Moduls ist ja nicht bekannt, sondern nur seine Definition).
  1389.  
  1390. Deshalb wird neben der Relozierliste eine extra Importliste für jedes impor~
  1391. tierte Modul angelegt, die neben dem bekannten Zeiger auf die Zeigerkette
  1392. jeweils eine Item-Nummer enthält. Diese Item-Nr. wird  vom  Compiler  beim
  1393. Übersetzen  eines  Definitionsmoduls  vergeben  und  sowohl  in  den  eigenen
  1394. Implementationsmodul-Code  und  eben  in  die  importierenden  Module  über~
  1395. nommen.  Im  der  Implementation  tauchen  sie  in  der  Export-Liste  auf,
  1396. zusammen mit der relativen Adresse der exportierten Var/Proc. Der Loader
  1397. durchsucht also beim  Linken  zweier  Module  nach  übereinstimmenden  Item-
  1398. Nummern und findet auf diese Weise die Referenz-Zeigerkette und die darin
  1399. nachzutragende (relative) Adresse.
  1400. A.10  Begriffserläuterungen                                                Anhang
  1401. ________________________________________________________
  1402.  
  1403.  
  1404. A.10    Begriffserläuterungen
  1405.  
  1406. Eigentlich sollte dieses Kapitel nur zum Nachschlagen unverständlicher Begriffe
  1407. dienen. Mittlerweile ist hier aber so viel an Fachwissen eingeflossen, daß es
  1408. sich auch für einen erfahrenen Programmierer  lohnen  dürfte,  das  gesamte
  1409. Kapitel einmal durchzustöbern.
  1410.  
  1411.  
  1412. Algorithmus
  1413.     Der Algorithmus bestimmt einen Funktionsablauf, eine Vorgehensweise. Ein
  1414.     Programm  besteht  aus  vielen  Algorithmen,  aber  auch  das  gesamte
  1415.     Programm kann als ein komplexer Algorithmus angesehen werden.
  1416.  
  1417. Argumentzeile
  1418.     Auch "Command-Line" genannt.
  1419.     So nennt sich der Text, der optional beim Starten von Programmen mit
  1420.     der Endung TTP vom Desktop (bzw. auch mit Endung MTP oder durch das
  1421.     Festhalten der Shift-Taste beim Start in der Megamax-Shell) eingegeben
  1422.     werden  kann.  Es  gibt  auch  Programme  (Shells),  z.B.  vornehmlich  auf
  1423.     MSDOS-,  CP/M-  oder  UNIX-Rechnern,  bei  denen  jedes  zu  startende
  1424.     Programm nicht mit der Maus aus einem Menü, sondern durch Eingabe
  1425.     ihres Namens in einer Eingabezeile, gestartet werden. Aus diesem älteren
  1426.     Konzept  geht  auch  die  Argumentzeile  hervor:  Man  kann  hinter  dem
  1427.     Programmnamen  weiteren  Text  eingeben,  der  dann  dem  gestarteten
  1428.     Programm in seiner Base Page übergeben wird. In der Megamax-Bibliothek
  1429.     ermöglicht beispielsweise das Modul ArgCV die Abfrage dieser Argument~
  1430.     zeile.
  1431.  
  1432.     Beispielsweise wertet fast jeder Editor seine Argumentzeile aus: Ist sie
  1433.     nicht leer, interpretiert er das erste Wort darin als einen Dateinamen und
  1434.     versucht, die Datei als Text zu laden. Weitere evtl. in der Zeile enthaltene
  1435.     Worte werden je nach Editor als weitere Textnamen (z.B. TEMPUS) oder
  1436.     andere Informationen interpretiert.
  1437.  
  1438.     Das Atari-Desktop unterstützt neben den Programmen mit TTP-Endung die
  1439.     Argumentzeile  noch  auf  eine  andere  Weise:  Wird  ein  Programm  im
  1440.     Desktop  unter  Anwendung  anmelden  für  eine  bestimmte  Dateiendung
  1441.     vorgesehen, wird bei einem Doppelklick auf eine Datei mit jener Endung
  1442.     das benannte Programm gestartet und der angeklickte Dateiname in der
  1443.     Argumentzeile übergeben.
  1444.  
  1445. Base Page
  1446.     Jedes Programm hat solch einen 256 Byte großen Puffer im Speicher. In
  1447.     ihm speichert das TOS alle zum Programm-Prozeß gehörigen Informationen,
  1448.     wie beispielsweise die offenen Dateien, die aktuellen Pfade und auch die
  1449.     Argumentzeile. Der dynamisch belegte Speicher (durch GEMDOS-Funktion
  1450. A.10  Begriffserläuterungen                                                Anhang
  1451. ________________________________________________________
  1452.  
  1453.  
  1454.     malloc bzw. Storage-Funktion ALLOCATE) des Programms wird ebenfalls
  1455.     über diese Base Page identifiziert.
  1456.  
  1457.     Das TOS hat eine Systemvariable, die immer den geraden aktiven Prozeß
  1458.     anzeigt: Es ist ein Zeiger auf die aktuelle Base Page. Theoretisch müßte
  1459.     auch beim Aktivieren eines Accessories diese Systemvariable auf dessen
  1460.     Base Page zeigen - leider hat hier das TOS einen Fehler: Der Zeiger wird
  1461.     nicht vom TOS umgesetzt, das gestartete Hauptprogramm bleibt weiterhin
  1462.     das "aktive", so daß beispielsweise eine Änderung der aktuelle Pfade im
  1463.     Accessory sich auch auf die Hauptanwendung auswirkt und angeforderter
  1464.     Speicher  nicht  dem  Accessory  sondern  dem  Hauptprogramm  gehört  -
  1465.     endet das Hauptprogramm, wird auch der vom  Accessory  angeforderte
  1466.     Speicher freigegeben.
  1467.  
  1468. Betriebssystem
  1469.     Das Betriebssystem ist eine Sammlung grundlegender Funktionen, die von
  1470.     extern gestarteten Programmen aufgerufen werden können,  damit  nicht
  1471.     jedes Programm alle Grundfunktionen selbst nochmal enthalten muß. Eine
  1472.     wichtige  Aufgabe  von  Betriebssystemen  ist,  Zugriffe  von  verschiedenen
  1473.     Programmen  auf  dieselben  Ressourcen  des  Computers  zentral  zu
  1474.     koordinieren, damit sich die Programme  nicht  gegenseitig  in  die  Quere
  1475.     kommen.  Jede  Programmiersprache,  auch  Megamax  Modula-2,  bietet
  1476.     ebenfalls  Grundfunktionen,  die  wiederum  auf  die  des  Betriebssystems
  1477.     zurückgreifen.
  1478.  
  1479. Booten
  1480.     Durch  Druck  auf  den  RESET-Taster  beim  Atari  ST  (meist  hinten  am
  1481.     Gehäuse)  oder  durch  Einschalten  wird  er  gebootet.  Dabei  wird  das
  1482.     Betriebssystem initialisiert (bzw. ein Initialisierungsprogramm im Betriebs~
  1483.     system gestartet) und danach ein Anwendungsprogramm gestartet. Beim
  1484.     Atari ST ist das normalerweise der GEM-Desktop, zuvor werden aber im
  1485.     Rahmen der vorbereitenden Initialisierung noch Programme gestartet, die
  1486.     sich  im  AUTO-Ordner  befinden,  und  solche,  die  sich  im  Wurzel-
  1487.     Verzeichnis der Boot-Disk befinden und die Extension ACC (Accessories)
  1488.     tragen.  Es  gibt  zwei  Arten  des  Bootens:  Den  Warmstart  und  den
  1489.     Kaltstart.  Der  Kaltstart  initialisiert  den  Rechner  vollständig,  inkl.  dem
  1490.     Löschen des Speichers. Er wird immer beim Einschalten durchgeführt. Der
  1491.     Warmstart löscht nicht den Speicher erneut, so daß nach einem fatalen
  1492.     Programmfehler  mit  etwas  Aufwand  ggf.  noch  Daten  im  Speicher  zu
  1493.     retten  sind.  Er  kann  durch  Druck  auf  den  RESET-Taster  ausgelöst
  1494.     werden.
  1495.  
  1496. Code, Object-File
  1497.     Ein  Code  bzw.  eine  Objekt-Datei  ist  eine  vom  Compiler  übersetzte
  1498.     Source. Der Code ist nicht mehr als Text lesbar, sondern ist eine kodierte
  1499.     Form,  die  Instruktionen,  Anweisungen  enthält,  die  z.B.  von  einem
  1500.     Mikroprozessor, wie dem 68000 im Atari ST, verstanden und ausgeführt
  1501. A.10  Begriffserläuterungen                                                Anhang
  1502. ________________________________________________________
  1503.  
  1504.  
  1505.     werden können. Allerdings spricht man bei Object-Files und Codes meist
  1506.     von einer Mischung solcher Instruktionen und zusätzlicher Informationen,
  1507.     die  für  einen  Linker  bestimmt  sind.  Bei  Compiler-Sprachen  sind  diese
  1508.     Codes  übersetzte  Module,  die  der  Linker  dann  zu  einem  Programm
  1509.     zusammenfügen kann.
  1510.  
  1511. Desktop
  1512.     Der Desktop bei einem GEM-Programm ist das Feld unter der Menüleiste.
  1513.     Sinnbildlich  steht  der  Desktop  für  die  Schreibtischoberfläche,  auf  der
  1514.     Blätter  (in  Form  von  Fenstern)  und  Symbole  für  Aktenordner  usw.
  1515.     herumliegen.
  1516.  
  1517. Dir, Directory
  1518.     Directory  (Abk.:  Dir)  ist  die  engl.  Bezeichnung  für  Disk-Verzeichnisse.
  1519.     Diese können das Wurzel-Verzeichnis oder ein Ordner auf einem Laufwerk
  1520.     sein.
  1521.  
  1522. Disk
  1523.     Die Disk - Abk. für Diskette; auch Hard-Disk, RAM-Disk oder sonstiger
  1524.     Massenspeicher.
  1525.  
  1526. Extension, Extender, Endung, Suffix
  1527.     Alle diese Begriffe bezeichnen den optionalen, durch einen Punkt  ange~
  1528.     hängten Typen-Bezeichner  an  einem  Dateinamen.  Viele  Endungen  haben
  1529.     eine feste Verwendung, um die Art und Verwendbarkeit von Dateien zu
  1530.     beschreiben: PRG, APP, TOS und TTP kennzeichnen  vom  GEM-Desktop
  1531.     ausführbare Programme,  TXT  und  DOC  weisen  auf  Dateien  mit  direkt
  1532.     lesbarem Text hin. Auch  beim  Megamax-System  sind  einige  bestimmte
  1533.     Endungen vergeben: Dateien, die auf M2P enden (Bsp: MM2SHELL.M2P),
  1534.     enthalten Parameter-Dateien für die Shell, MOD sind unter der Shell als
  1535.     Programm ausführbare Module.
  1536.  
  1537. GEM-Datei-Selektor, File-Selektor
  1538.     Der Datei-Selektor dient zum menüorientierten Auswählen von Dateien. Er
  1539.     wird über die GEM-Funktion 'fsel input' (bei Megamax: GEMEnv.SelectFile)
  1540.                                        _
  1541.     aufgerufen und zeigt dann ein Inhaltsverzeichnis, aus dem eine Datei mit
  1542.     der Maus bequem ausgesucht werden kann. Er erscheint beispielsweise,
  1543.     wenn mit einem der Megamax-Editoren eine neue, noch unbenannte Datei
  1544.     geladen werden soll.
  1545.  
  1546. GEM-Desktop
  1547.     Als GEM-Desktop bezeichnen wir die Anwendung, die normalerweise nach
  1548.     dem  Einschalten  des  Atari  ST  gestartet  wird,  und  von  der  dann  alle
  1549.     weiteren  Programme  gestartet  werden  können.  Der  GEM-Desktop  ist
  1550.     ebenfalls eine Shell, wie die Megamax-Shell.
  1551. A.10  Begriffserläuterungen                                                Anhang
  1552. ________________________________________________________
  1553.  
  1554.  
  1555. Heap
  1556.     So nennt man den Speicherbereich, der einem laufenden Programm für
  1557.     dynamische  Speicheranforderungen  zur  Verfügung  steht.  Er  wird  vom
  1558.     Betriebssystem  (GEMDOS)  verwaltet.  Über   die   GEMDOS-Funktionen
  1559.     Malloc,  Mfree  und  Mshrink  können  Teile  von  ihm  von  Programmen
  1560.     reserviert und wieder freigegeben werden. Modula-Programme sollten aber
  1561.     die dafür vorgesehenen Funktionen des Moduls Storage verwenden. Dieses
  1562.     Modul arbeitet mit den GEMDOS-Funktionen zusammen, macht aber eine
  1563.     zusätzliche  Verwaltung,  die  bei  vielen  kleinen  Häppchen  nicht  nur
  1564.     platzsparender und schneller ist,  sondern  auch  sicherer,  weil  es  einen
  1565.     prinzipiellen  Fehler  des  GEMDOS  löst:  Es  dürfen  beim  GEMDOS  pro
  1566.     Prozeß nur ca. 20-40 Blöcke angefordert sein, sonst passieren je nach
  1567.     TOS-Version  mehr  oder  weniger  unschöne  Dinge  (ab  TOS  kann  es
  1568.     beispielsweise u.U. zu der Meldung Out of internal  memory  kommen  -
  1569.     dann steht der Rechner, und man kann nur noch die Reset-Taste drücken).
  1570.     Vorsicht: Gehen Sie nie davon aus, daß Speicher, der vom Heap ange~
  1571.     fordert wurde, gelöscht, d.h. mit Null-Werten beschrieben, ist!
  1572.  
  1573. Key
  1574.     Der  Modul-Key  wird  vom  Compiler  beim  Übersetzen  eines  Definitions~
  1575.     moduls errechnet und dann in der erzeugten Code-Datei abgelegt (4 Byte).
  1576.     Zur Berechnung werden die maßgebenden Namen und Strukturen heran~
  1577.     gezogen.  Jede  Änderung  an  einem  Bezeichner-Namen  oder  seiner
  1578.     Definition erreicht die Berechnung eines anderen Key-Wertes.
  1579.  
  1580.     In  den  Codes  aller  Module,  die  nun  dieses  Modul  importieren,  wird
  1581.     wiederum  auch  dieser  Key-Wert  gespeichert.  So  ist  eine  Beziehung
  1582.     zwischen dem importierten Modul und seinem Klienten erreicht. Werden
  1583.     nun diese Module vom Loader oder Linker zusammengefügt, werden die
  1584.     Key-Werte der importierenden Module mit dem Original-Key des importier~
  1585.     ten Moduls verglichen. Sind sie nicht identisch, bedeutet das, daß nicht alle
  1586.     diese Module unter derselben Definition übersetzt wurden. Das könnte zu
  1587.     fatalen  Fehler  im  Programm  führen,  so  daß  Linker  bzw.  Loader  den
  1588.     Bindevorgang mit der Fehlermeldung "Versionskonflikt" abbrechen.
  1589.  
  1590. Literale
  1591.     ISO definiert drei Arten von Konstant-Typen, auch Literale genannt: Z (im
  1592.                                                                              Z
  1593.     Handbuch meist ZZ), S (SS) und R  (RR). ZZ sind Ganzzahl-Konstanten,
  1594.                             S            R
  1595.     wie 12 oder -456. RR sind entsprechend für Real-Konstanten (12.0 oder
  1596.     -3.001)  vorgesehen.  SS  steht  schließlich  für  String-Konstanten,  also
  1597.     "abc",  "1",  ""  (Leerstring)  und  auch  7C  (ehemals  Zeichenkonstanten).
  1598.     ZZ-Typen sind zu SHORTINT, SHORTCARD, LONGINT  UND  LONGCARD
  1599.     kompatibel, RR zu  REAL  und  LONGREAL,  SS  zu  String-Typen  (ARRAY
  1600.      0..n  OF  CHAR)  und  zu  CHAR.  Wird  ein  Leerstring  auf  eine  CHAR-
  1601.     Variable  zugewiesen,  wird  daraus  das  String-Abschlußzeichen   (bei
  1602.     Megamax: 0C).
  1603. A.10  Begriffserläuterungen                                                Anhang
  1604. ________________________________________________________
  1605.  
  1606.  
  1607. Modul
  1608.     In  einem  Modul  sind  in  der  Regel  mehere  Funktionen  (Prozeduren)
  1609.     versammelt,  die  einen  logischen  Zusammenhang  haben.  So  enthält  das
  1610.     Standard-Modul Storage Funktionen zum Reservieren und Verwalten von
  1611.     Speicherbereichen,  das  Modul  InOut  bietet  Funktionen  zur  einfachen
  1612.     Ein-/Ausgabe auf den Bildschirm.
  1613.  
  1614. Ordinale
  1615.     Hierzu zählt man alle unstrukturierten Datentypen, die abzählbar sind, wie
  1616.     CARDINAL, INTEGER, Aufzählungstypen, BOOLEAN und CHAR.
  1617.  
  1618. Programm, Anwendung
  1619.     Das Programm ist in der Regel eine Sammlung von Funktionen, meist aus
  1620.     mehreren  Modulen.  Während  ein  Modul  nur  eine  Funktionssammlung
  1621.     darstellt,  ist  ein  Programm  eine  ablauffähe  Anwendung.  Ein  Programm
  1622.     kann  gestartet  werden,  dann  führt  es  die  darin  zusammengefaßten
  1623.     Funktionen und Algorithmen aus.
  1624.  
  1625. Prozeß
  1626.     Verwechseln  Sie  Prozeß  nicht  mit  Coroutinen.  Letztere  sind  die  von
  1627.     N.Wirth   in   Modula-2   eingeführten   Pseudo-Prozesse,   die   durch
  1628.     NEWPROCESS  eingerichtet  werden.  Unter  einem  Prozeß  verstehen  wir
  1629.     dagegen  ein  laufendes  Programm  mitsamt  seiner  Umgebung.  Solche
  1630.     Prozesse  werden  durch  die  GEMDOS-Funktion  Pexec  gestartet.  Die
  1631.     Megamax-Bibliothek bietet zwei komfortable Funktionen zum Starten eines
  1632.     Prozesses: Loader.CallModule startet gelinkte Programmdateien und auch
  1633.     ungelinkte  Megamax-Module  von  Disk,  ModCtrl.ExecProcess  startet  in
  1634.     gleicher Weise Prozeduren innerhalb eines Programms (beides sind sog.
  1635.     Tochter-Prozesse, weil sie vom Vater-Prozeß gestartet werden und bei
  1636.     Prozeßende auch wieder zum Aufruf des Vaters zurückkehren).
  1637.  
  1638. resident
  1639.     Resident bedeutet "gegenwärtig". Von residenten Modulen wird gesprochen,
  1640.     wenn sie zum jenem Zeitpunkt in ihrer Umgebung vorhanden, aktiv sind.
  1641.     Konkret bedeutet das: Wenn ein Programm, z.B. die Shell, gestartet wurde
  1642.     und nun abläuft, sind die Module, aus denen dieses Programm besteht,
  1643.     resident  in  der  Shell  vorhanden.  Dem  gegenüber  gibt  es  Module,  die
  1644.     dazu-geladen werden, aber nicht resident sind, weil sie nicht zur augen~
  1645.     blicklichen Umgebung, also der Shell, gehören.
  1646.  
  1647. Ressourcen
  1648.     Die  Ressourcen  sind  die  grundlegenden  Betriebsmittel  eines  Computers
  1649.     oder  eines  Programms.  Beispiele  für  Ressourcen:  Die  verschiedenen
  1650.     Hardware-Gegebenheiten, wie der Arbeitsspeicher (für den die Speicher~
  1651.     verwaltung des Betriebssystems zuständig ist, um  ihn  für  verschiedene
  1652.     Programme  bei  Bedarf  aufzuteilen),  der  Bildschirm,  die  Tastatur,  die
  1653. A.10  Begriffserläuterungen                                                Anhang
  1654. ________________________________________________________
  1655.  
  1656.  
  1657.     Schnittstellen, die Tonausgabe usw. Eine  geläufigere  Ressource  ist  die
  1658.     GEM-Resource,  die  eine  Sammlung  von  GEM-Objekten  (Dialogboxen,
  1659.     Menüzeilen, Texte, Desktop-Symbole usw.) enthält, mit einem "Resource-
  1660.     Construction-Program"  erstellt  und  von  den  GEM-Funktionen  des  TOS
  1661.     verwaltet werden kann.
  1662.  
  1663. RR
  1664.     Siehe Literale
  1665.  
  1666. Skalare
  1667.     Hierzu  zählen  wir  im  Handbuch  alle  ordinalen  Datentypen,  sowie  alle
  1668.     Joker-Typen  (LOC,  BYTE,  WORD,  LONGWORD)  und  die  Zeiger-Typen
  1669.     (ADDRESS, POINTER TO...).
  1670.  
  1671. Shell
  1672.     Eine  Anwendung,  von  der  aus  andere  Anwendungen  koordiniert  und
  1673.     angesprochen werden können. Beispiele für Shells sind der GEM-Desktop
  1674.     und  die  Megamax-Shell.  Es  gibt  auch  Commandline-Shells:  Sie  haben
  1675.     dieselbe  Funktion,  ermöglichen  aber  die  Bedienung  generell  nicht  über
  1676.     GEM-Objekte, wie Symbole, Menüleisten und Fenster, sondern durch eine
  1677.     Art Terminal, in dem die Funktionen und Programmaufrufe durch Eingabe
  1678.     von Befehlen in Worten erfolgt.
  1679.  
  1680. Source
  1681.     Der oder die Source ist der engl. Ausdruck für eine Textdatei, die ein
  1682.     Programm, ein Modul oder auch nur einzelne Routinen oder Definitionen
  1683.     formuliert.  Sie  wird  im  Deutschen  auch  als  Quelltext  oder  Quelle
  1684.     bezeichnet.
  1685.  
  1686. SS
  1687.     Siehe Literale
  1688.  
  1689. Terminal, Console
  1690.     So  bezeichnen  wir  GEM-Anwender  die  Kombination  einer  einfachen
  1691.     Ausgabeeinheit für Text (ohne Grafik) und  einer  Tastatur  als  Eingabe~
  1692.     einheit. Programme, die die Extension "TOS" oder "TTP" haben, laufen in
  1693.     solch  einem  Terminal-Modus:  Sie  bieten  keine  GEM-Bedienung,  wie
  1694.     Verwendung der Maus und  Anzeige  der  Informationen  in  Fenstern  und
  1695.     Symbolen, sondern nur schlichte, blockorientierte Textausgabe.
  1696.  
  1697. TOS
  1698.     Das TOS ist das Betriebssystem des Atari ST. Es besteht aus aus dem
  1699.     grafischen Teil (GEM, das wiederum aus AES und VDI besteht) und dem
  1700.     Datei-Verwaltungsteil   (GEMDOS).   Diese   Teile   können   von   anderen
  1701.     Programmen ohne weiteres verwendet werden. Dann gibt es noch die sog.
  1702.     Treiber, wie Line-A und das BIOS  (inkl.  XBIOS).  Diese  Treiber  dienen
  1703. A.10  Begriffserläuterungen                                                Anhang
  1704. ________________________________________________________
  1705.  
  1706.  
  1707.  
  1708.     lediglich als Grundfunktionen für GEMDOS und GEM und  sollten  in  der
  1709.     Regel  nicht  (vor  allem  gilt  das  für  die  Line-A  Routinen)  von  anderen
  1710.     Programmen  verwendet  werden,  weil  sie  auf  späteren  Versionen  des
  1711.     Betriebssystems  TOS  ggf.  nicht  mehr  in  dieser  Form  vorhanden  sind.
  1712.     Dagegen sind die Funktionen von GEM und GEMDOS garantiert auch in
  1713.     zukünftigen TOS-Versionen verfügbar.
  1714.  
  1715. Treiber
  1716.     Ein Treiber ist eine Funktionseinheit (Modul, Funktionssammlung), die die
  1717.     Vermittlung  zwischen  einer  definierten,   portablen   (standardisierten),
  1718.     Schnittstelle und der veränderlichen Umgebung herstellt. Treiber im TOS,
  1719.     wie  das  BIOS,  bieten  den  standardisierten  GEMDOS-Funktionen  (die
  1720.     wurden  von  "Digital  Research"  entwickelt  und  sind  auch  für  andere
  1721.     Computer  in  derselben  Form  verfügbar)  den  Zugriff  auf  die  Atari-
  1722.     spezifischen Ressourcen, wie Ein-/Ausgabeeinheiten (Bildschirm, Tastatur,
  1723.     Disk) und dem Arbeitsspeicher.
  1724.  
  1725. Umgebung
  1726.     Die  Umgebung  ist  alles,  was  ein  Programm  außerhalb  seiner  selbst
  1727.     implementierten Algorithmen und Funktionen vorfindet. Diese Umgebung ist
  1728.     in der Regel veränderbar, während das Programm selbst eine festgelegte
  1729.     Form hat. So gehören der freie Speicherplatz, die Ausgabemöglichkeiten
  1730.     und Größe des Bildschirms, die über die Tastatur eingebbaren Zeichen, die
  1731.     verfügbaren  Massenspeicher  und  auch  das  Betriebssystem  zu  der
  1732.     Umgebung jedes Programms. Bei Megamax Modula kann jedes Programm
  1733.     über Treiber-Module komfortabel auf verschiedene Umgebungen angepaßt
  1734.     werden, ohne daß das Programm selbst dazu geändert werden müßte.
  1735.  
  1736. Versionskonflikt
  1737.     Siehe unter Key.
  1738.  
  1739. ZZ
  1740.     Siehe Literale
  1741. A.10  Lehrseite                                                            Anhang
  1742. ________________________________________________________
  1743.  
  1744.  
  1745. Leerseite
  1746.     Eine  Leerseite  ist  in  der  Regel  eine  Seite,  die  leer  ist.  Ausnahmen
  1747.     bestätigen die Regel.
  1748. A.11  Anpassen alter Megamax Modula Programme                       Anhang
  1749. ________________________________________________________
  1750.  
  1751.  
  1752. A.11    Anpassung  alter  Programme
  1753.  
  1754.  
  1755. Hier erfahren Sie, wie Sie Ihre alten Modula-Programme, die mit dem System
  1756. der  Version  1  (Compiler-Version  3)  auf  das  neue  System  der  Version  2
  1757. (Compiler-Version 4) übertragen.
  1758.  
  1759. Sie sind leider gezwungen, alle Ihre alten Module neu zu übersetzen. Machen
  1760. Sie  sich  zuvor  mit  der  Bedienung  von  ModRef  (Kap.  2.7)  vertraut,  das
  1761. Programm kann Ihnen dabei eine große Hilfe sein.
  1762.  
  1763. Auf  die  meisten  notwendigen  Änderungen  wird  Sie  der  Compiler  selbst
  1764. hinweisen. Sie müssen dann nur die entsprechenden Korrekturen vornehmen.
  1765. Meist müssen Sie eine Funktion nun aus einem anderen Modul importieren oder
  1766. einen Parameter ergänzen.
  1767.  
  1768. Schwierig wird es, wenn Sie Funktionen der Megamax-Bibliothek in Assembler
  1769. aufgerufen haben und sich dort nun Parameter geändert haben. In diesem Fall
  1770. kann Ihnen der Compiler nicht helfen - Sie müssen die betroffenen Stellen
  1771. selbst finden und anpassen.
  1772.  
  1773.  
  1774. Änderungen am Compiler von Version 3 auf Version 4.
  1775.  
  1776. Folgende Änderungen werden vom Compiler nicht als Fehler angezeigt, müssen
  1777. aber angepaßt werden, damit die Programme wie bisher laufen:
  1778.  
  1779. Bei eingeschaltetem Range-Check ($R+) wird nun ein Laufzeitfehler angezeigt,
  1780. wenn bei einer CASE-Anweisung keine der Selektionen zutrifft und auch kein
  1781. ELSE-Zweig besteht. Abhilfe: Entweder die Module mit $R- übersetzen ("-R"
  1782. in der Direktiven-Zeile der Compiler-Box) oder leere ELSE-Zweige einfügen.
  1783.  
  1784. Ebenso  werden  nun  Über-/Unterläufe  bei  INC  und  DEC  bei  $R+  erkannt.
  1785. Normalerweise ist das sicher auch erwünscht, so daß hierauf kaum geachtet
  1786. werden muß.
  1787.  
  1788. Die Compiler der Version 3 kannten nur einen Real-Typ (64 Bit) namens REAL.
  1789. Dieser heißt nun LONGREAL. Bei alten Programmen sollten Sie deshalb alle
  1790. Vorkommen von REAL durch LONGREAL ersetzen. Analog muß auch FLOAT
  1791. nach LFLOAT umbenannt werden!
  1792.  
  1793. SETs mit mehr als 8 Elementen werden nun anders angeordnet. Für Zugriffe
  1794. auf  externe  Sets  (Hardware-Bits,  GEM-Sets)  müssen  die  Set-Definitionen
  1795. entweder angepaßt oder mit der Option $U- (s. Compiler-Direktiven) übersetzt
  1796. werden. Vorsicht auch mit dem Operieren auf diesen Sets in Assembler!
  1797. A.11  Anpassen alter Megamax Modula Programme                       Anhang
  1798. ________________________________________________________
  1799.  
  1800.  
  1801. Die  Elemente  von  RECORDs  werden  nun  immer  in  ihrer  Deklarationsfolge
  1802. abgelegt, auch wenn sie mit Kommata aufgezählt werden. Die alte, umgekehrte
  1803. Reihenfolge können Sie mit der Direktive $T- wiedererlangen.
  1804.  
  1805. Die weiteren Fälle werden vom Compiler erkannt, so  daß  nach  ihnen  nicht
  1806. extra gesucht zu werden braucht:
  1807.  
  1808. Was früher VAL war, heißt nun CAST. Wurde VAL benutzt, mußte es aus
  1809. SYSTEM importiert werden. Da VAL nun nicht mehr in SYSTEM ist, wird der
  1810. Compiler  den  Import  sofort  bemäkeln.  Ersetzen  Sie  dann  einfach  alle
  1811. Vorkommen von VAL durch CAST. In wenigen Fällen kann es vorkommen, daß
  1812. auch CAST nicht mehr erlaubt ist - informieren Sie sich dann im Kapitel des
  1813. Compiler über CAST.
  1814.  
  1815. Strings ungleicher Länge sind nicht mehr zuweisungskompatibel. Benutzen Sie
  1816. Assign aus dem Strings-Modul!
  1817.  
  1818. Laufvariablen für FOR unterliegen nun einigen Einschränkungen. Mehr dazu im
  1819. Kapitel zum Compiler. Abhilfe  läßt  sich  meist  durch  Einführen  einer  neuen
  1820. lokalen Variable leisten.
  1821.  
  1822. ASSEMBLER muß nun aus SYSTEM importiert werden.
  1823.  
  1824. Das Format der erzeugten Definitions-Codemodule wurde leicht verändert: Die
  1825. eigene Item-Nr. in der Import-Liste ist nun nur noch zwei statt vier Byte groß.
  1826.  
  1827.  
  1828. Änderungen in der Bibliothek von Systemversion 1 auf Version 2.
  1829.  
  1830. Hinweis: Wenn ein Bezeicher nicht mehr in dem bisherigen Modul vorhanden
  1831. ist,  sondern  nun  aus  einem  anderen  Modul  exportiert  wird,  können  Sie
  1832. beispielsweise im Gepard-Editor den Cursor auf den Bezeichner bewegen und
  1833. dann mit der Taste F6 nach dem Bezeichner in der gesamten Bibliothek suchen
  1834. lassen  (allerdings  dürfen  die  übersetzten  Definitionsmodule  dazu  nicht
  1835. komprimiert sein, s. Kap. 2.4).
  1836.  
  1837. Diverse Module
  1838.  *  FileBase.ErrMsgField  heißt  nun  MOSConfig.FileErrMsg;  ErrBase.MsgField
  1839.     heißt nun MOSConfig.RuntimeErrMsg.
  1840.  *  Die Funktionen WriteNum, ConvNum und NumToStr erlauben nun am Ende
  1841.     die Angabe des Füll-Zeichens. Zur Anpassung ist hier "0" anzugeben.
  1842.  *  ReadReal akzeptiert nun Variablen vom Typ REAL - für LONGREALs ist
  1843.     ReadLReal hinzugekommen.
  1844.  
  1845. Calls
  1846.  *  CallSystem und CallExternal  wurden  entfernt,  statt  dessen  können  nun
  1847.     CALLSYS und CALLEXT aus SYSTEM verwendet werden.
  1848. A.11  Anpassen alter Megamax Modula Programme                       Anhang
  1849. ________________________________________________________
  1850.  
  1851.  
  1852. Clock
  1853.  *  Die Typen Time und Date befinden sich nun im Modul MOSGlobals.
  1854.  
  1855. Directory
  1856.  *  Der Eintrag path bei DirQueryProc ist nun ein REF-Parameter. Wenn Sie
  1857.     DirQuery   benützen,   muß   demnach   die   angegebene   Prozedur   das
  1858.     Schlüsselwort "REF" beim path-Parameter erhalten.
  1859.  *  DirQuery liefert nicht mehr den Wert Null, wenn keine passenden Dateien
  1860.     gefunden werden, sondern den Wert Fünf (MOSGlobals.fNoMatchingFiles).
  1861.     Wer wie empfohlen Fehler bisher durch den Test auf negative Werte und
  1862.     nicht durch Null-Vergleich erkannte, dürfte damit keine Probleme haben.
  1863.  *  Das   Aufzählungselement   writtenAndClosedAttr   wurde   in   archiveAttr
  1864.     umbenannt.
  1865.  *  Die Typen Drive und DriveSet befinden sich nun im Modul MOSGlobals.
  1866.  *  Die Funktionen SplitPath und SplitName sind nun im Modul FileNames.
  1867.  
  1868. Excepts
  1869.  *  ExcDesc wurde nach MOSGlobals übertragen.
  1870.  
  1871. GemEnv
  1872.  *  Die Funktion SuspendedProcess wurde entfernt, da sie unbrauchbar war.
  1873.  *  Die FileSelect-Routine befindet sich nun im Modul PathEnv und hat einen
  1874.     zusätzlichen String-Parameter title, der ab TOS 1.4 als Text oben in der
  1875.     Auswahlbox erscheint. Bei älteren TOS-Versionen erscheint kein Text -
  1876.     der Parameter wird ignoriert. Zur einfachen Anpassung setzen Sie hier
  1877.     einfach einen Leerstring ein.
  1878.  
  1879. Keyboard
  1880.  *  Die  Typen  zur  Beschreibung  der  Tastencodes  befinden  sich  nun  in
  1881.     MOSGlobals; die Read-Funktionen wurden entfernt (s. KbdCtrl).
  1882.  
  1883. KbdCtrl
  1884.  *  Das Conterm-Bit muß nun von außen gesetzt werden, z.B. mit der dortigen
  1885.     Funktion ExtendedMode (TRUE).
  1886.  
  1887. Loader
  1888.  *  Bei CallModule und LoadModule wurden die Parameter verändert. Hinzu~
  1889.     gekommen ist ein Zeiger auf ein selbstdefiniertes "Environment", der in
  1890.     der Regel Null (oder NIL) sein sollte! Weggefallen ist der Parameter für
  1891.     die  Stack-Größe.  Diese  und  auch  einige  weitere  zum  Hauptprogramm
  1892.     gehörende  Informationen  (z.B.  Treiber-Module)  werden  in  Bälde  bei
  1893.     jeweiligen Programm fest vorbestimmbar sein. Solange diese Möglichkeit
  1894.     noch nicht gegeben ist, wird die Stack-Größe durch die Loader-Variable
  1895.     "DefaultStackSize" bestimmt.
  1896. A.11  Anpassen alter Megamax Modula Programme                       Anhang
  1897. ________________________________________________________
  1898.  
  1899.  
  1900.  
  1901. M2Init
  1902.  *  In Systemversion 1 erhielt M2Init in A0 einen Zeiger auf die base page
  1903.     übergeben - nun geschieht dies nur noch bei Accessories; ist der Wert
  1904.     Null, ist es kein Accessory-Start und man erhält den Zeiger auf die base
  1905.     page über die Adressierung 4(A7). Außerdem wird nun in A2 der Zeiger
  1906.     auf den PDB übergeben, dieser lag bisher immer bei einem  konstanten
  1907.     Abstand vom Codebeginn aus.
  1908.  
  1909. Paths
  1910.  *  Die  Definitionen  von  PathList  und  PathEntry  stehen  nun  im  Modul
  1911.     PathCtrl.
  1912.  *  Die  Funktionen  StdPaths,  SetPaths,  New-  und  PrevStdPaths  wurden
  1913.     entfernt, statt dessen muß nun eine eigene Variable für die entsprechende
  1914.     Liste deklariert werden.
  1915.  *  Der FileSelector für SearchFile wird nun im Modul PathEnv definiert.
  1916.  
  1917. SysCtrl
  1918.  *  Der  Supervisor-TRAP-Handler  ist  entfernt  worden.  Nur  TRANSFER/
  1919.     IOTRANSFER benutzen nun noch einen  TRAP-Vektor.  Dieser  kann  jetzt
  1920.     einfacher durch Verändern der  Variable  CoroutineTrapNo  in  MOSConfig
  1921.     bestimmt werden.
  1922.  
  1923. SYSTEM
  1924.     IOTRANSFER beläßt die Coroutine im Supervisor-Modus, wenn sie durch
  1925.     einen Interrupt (Exception) aktiviert wurde.
  1926.  
  1927. TimeConvert
  1928.  *  Die Funktion TimeToString hat nun einen optionalen Format-Parameter. Zur
  1929.     Anpassung geben Sie einen Leerstring an.
  1930.  
  1931. XBIOS
  1932.  *  SuperExec hat nun einen PROC- statt ADDRESS-Parameter. Damit entfällt
  1933.     das lästige Typwandeln, wenn eine Modula-Prozedur  darüber  aufgerufen
  1934.     werden soll.
  1935.